私のメッセージボックスは、タイトルバーに自分のアプリケーションのアイコン(または他のアイコン)を表示する必要があります。WPF:なぜメッセージボックスにタイトルバーのアイコンがありませんか
答えて
MessageBox
in WPFは、単に標準MessageBox
in user32.dll
のラッパーです。これは、Windows自体がダイアログボックスを表示するために呼び出す機能とまったく同じです。 WPFアプリケーションでは、Win32 API(WinForms、MFCなど)に依存する他のアプリケーションとは異なります。
Reflectorを使用すると、WPFでMessageBox
という関連する関数を調べることでこれを確認できます。あなたが気づいたように、このメッセージボックスには、そのタイトルバーにアイコンが表示されません
[SecurityCritical]
private static MessageBoxResult ShowCore(IntPtr owner, string messageBoxText, string caption, MessageBoxButton button, MessageBoxImage icon, MessageBoxResult defaultResult, MessageBoxOptions options)
{
if (!IsValidMessageBoxButton(button))
{
throw new InvalidEnumArgumentException("button", (int) button, typeof(MessageBoxButton));
}
if (!IsValidMessageBoxImage(icon))
{
throw new InvalidEnumArgumentException("icon", (int) icon, typeof(MessageBoxImage));
}
if (!IsValidMessageBoxResult(defaultResult))
{
throw new InvalidEnumArgumentException("defaultResult", (int) defaultResult, typeof(MessageBoxResult));
}
if (!IsValidMessageBoxOptions(options))
{
throw new InvalidEnumArgumentException("options", (int) options, typeof(MessageBoxOptions));
}
if ((owner != IntPtr.Zero) && ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) != MessageBoxOptions.None))
{
throw new ArgumentException(SR.Get(SRID.CantShowMBServiceWithOwner, new object[0]));
}
int type = (int) (((button | ((MessageBoxButton) ((int) icon))) | DefaultResultToButtonNumber(defaultResult, button)) | ((MessageBoxButton) ((int) options)));
IntPtr zero = IntPtr.Zero;
if ((options & (MessageBoxOptions.ServiceNotification | MessageBoxOptions.DefaultDesktopOnly)) == MessageBoxOptions.None)
{
if (owner == IntPtr.Zero)
{
zero = UnsafeNativeMethods.GetActiveWindow();
}
else
{
zero = owner;
}
}
return Win32ToMessageBoxResult(UnsafeNativeMethods.MessageBox(new HandleRef(null, zero), messageBoxText, caption, type));
}
:具体的にはUnsafeNativeMethods.MessageBox
を呼び出すコードの最後の行を、注意してください。これは、ウィンドウがWS_CAPTION
とWS_SYSMENU
のスタイルを指定せずに作成されたためです。またwhile possibleの場合、user32.dllのサブクラスにはMessageBox
とchange its window stylesという簡単な方法がありません。タイトルバーにアイコンが表示されます。結果として得られるコードは厄介で、率直にも問題のない価値があります。
最適な解決策は、独自のダイアログボックスを作成し、代わりにコードから呼び出すことです。これには、アイコンを追加する機能以外にも、WPFでの相互運用性の問題(完全に管理されたコードを使用する)を修正すること、アプリケーションで使用されるカスタムテーマに合わせて必要に応じてダイアログボックスをテーマ化すること。始めるのを助けるために、このようなものを試してみてください。あなたは(それらの前にVistaに)以前のバージョンのWindowsをターゲットにする必要がない場合
あるいは、あなたは、COMCTRL32.DLLのバージョン6に設けられTaskDialog
を使用することができます標準MessageBox
を置き換えて拡張しています。ただし、これは.NET Frameworkの標準クラスには含まれていないため、P/Invokeにする必要があります。利用可能な多くの例の1つについては、hereを参照してください。
また、利用可能なWindowsのバージョンでTaskDialog
を利用し、そうでない以前のバージョンでそれをエミュレートするサンプルプロジェクトがいくつかあります。 (私は個人的に私の.NETアプリケーションの多くで非常に類似したものを使用しています。)
独自のカスタムメッセージボックスを作成することができます。画像、アニメーション、ビデオなどを使ってユーザーコントロールを作成し、ShowDialogを呼び出すことができます。this exampleから開始できます。
はい私は1つを作成し、私のことができます問題は、なぜBCLでデフォルトで利用できないのかについての理由を見つけることでした –