ブログ用 画像ユーティリティ ② コマンドライン引数の処理
コマンドライン引数の処理には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バージョンにコードを修正