2010-11-18 11 views

答えて

5

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_CAPTIONWS_SYSMENUのスタイルを指定せずに作成されたためです。またwhile possibleの場合、user32.dllのサブクラスにはMessageBoxchange its window stylesという簡単な方法がありません。タイトルバーにアイコンが表示されます。結果として得られるコードは厄介で、率直にも問題のない価値があります。

最適な解決策は、独自のダイアログボックスを作成し、代わりにコードから呼び出すことです。これには、アイコンを追加する機能以外にも、WPFでの相互運用性の問題(完全に管理されたコードを使用する)を修正すること、アプリケーションで使用されるカスタムテーマに合わせて必要に応じてダイアログボックスをテーマ化すること。始めるのを助けるために、このようなものを試してみてください。あなたは(それらの前にVistaに)以前のバージョンのWindowsをターゲットにする必要がない場合


あるいは、あなたは、COMCTRL32.DLLのバージョン6に設けられTaskDialogを使用することができます標準MessageBoxを置き換えて拡張しています。ただし、これは.NET Frameworkの標準クラスには含まれていないため、P/Invokeにする必要があります。利用可能な多くの例の1つについては、hereを参照してください。

また、利用可能なWindowsのバージョンでTaskDialogを利用し、そうでない以前のバージョンでそれをエミュレートするサンプルプロジェクトがいくつかあります。 (私は個人的に私の.NETアプリケーションの多くで非常に類似したものを使用しています。)

0

独自のカスタムメッセージボックスを作成することができます。画像、アニメーション、ビデオなどを使ってユーザーコントロールを作成し、ShowDialogを呼び出すことができます。this exampleから開始できます。

+2

はい私は1つを作成し、私のことができます問題は、なぜBCLでデフォルトで利用できないのかについての理由を見つけることでした –