Jaa


ブログ用 画像ユーティリティ ② コマンドライン引数の処理

コマンドライン引数の処理にはApplication.Startupイベントの記事を利用します。

App.xamlにスタートアップ メソッド名を追加して(app_Startup)、App.xaml.csでそのメソッドを実装します。VgaBitmapは後述する画像用のコンテナクラスです。内容は単にコマンドラインからファイル名を取得し、VgaBitmapをコンストラクトして、Saveメソッドを呼び出して保存し、this.Shutdown()を呼び出して終了するだけです。

最初はWindows1.xaml.csで同じことをやっていたのですが、ウィンドウを開いてすぐ閉じると、表示するWPFコンポーネントとBimapImageコンストラクションとの衝突があるのか、BitmapImage関連の例外を投げるときがあったので、App.xaml.csだけで処理することにしました。

この実装では何も表示せずサイレントに終わってしまうので、メッセージボックスとか、音とか、アニメーションがあったほうが正しいUXのような気もします。この使い方のときは、複数画像をドラッグすると全て処理します(起動してからは、ウィンドウに表示できるのが1つの画像だけなので、処理できるのも1画像だけです)。

<Application x:Class="ImageManipulation.App"
xmlns=https://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=https://schemas.microsoft.com/winfx/2006/xaml
Startup="app_Startup" StartupUri="Window1.xaml">
  <Application.Resources>
  </Application.Resources>
</Application>

public partial class App : Application
{
  /// <summary>
  /// コマンドラインを処理するスタートアップ 
  /// </summary>
  void app_Startup(object sender, StartupEventArgs e)
  {
    if (e.Args.Length == 0) return;
    foreach (string argument in e.Args)
    {
      if (argument.Contains(".jpg") ||
argument.Contains(".JPG"))
{  
        VgaImageUC vga = new VgaImageUC(argument);
        vga.Save();
}
      else
      {
        MessageBox.Show("jpg以外の画像は処理できません、
          jpgの画像をドラッグしてください",
"Not jpg file", MessageBoxButton.OK);
      }
    }
    this.Shutdown();
  }
}

追記:UserControlバージョンにコードを修正