デフォルトのWindowsスタイルをWPFの標準MessageBox
に適用する方法は?
たとえば、次のコードを実行すると:
MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButton.OKCancel,
MessageBoxImage.Exclamation);
メッセージボックスが表示されます。
しかし、WinFormsでは、スタイルに問題はありません。
MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButtons.OKCancel,
MessageBoxIcon.Exclamation);
this pageによると、WPFはいくつかのコントロールの古いスタイルを選択します。
それを取り除くには、カスタムapp.manifestファイルを作成し(追加->新しいアイテム->アプリケーションマニフェストファイル)、次のコードを(/ trustInfo-Tagの直後に)貼り付ける必要があります。
<!-- Activate Windows Common Controls v6 usage (XP and Vista): -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
次に、このapp.manifestを使用してソリューションをコンパイルする必要があります(プロジェクトのプロパティ->アプリケーション->「アイコンとマニフェスト」で新しいマニフェストをポイントします)。
ここでアプリケーションを起動すると、WinForms-MessageBoxのようになります。
また、WPFの場合、 WPFメッセージボックス を持つ Extended WPF Toolkit を使用することをお勧めします。
WinFormsが動作する理由は、Main関数で視覚スタイルがオンになっている(つまり、Common Controls v6を使用している)ためです。 System.Windows.Forms.Application.EnableVisualStyles() への呼び出しを削除すると、WinFormsメッセージボックスはWPFのようになります。
これは、おそらくすべてのWPFコントロールがレンダリングされるため、新しいバージョンのCommon Controlsを使用する必要がないため、WPFアプリでは発生しません。
WPFアプリケーションの起動時にどこかでEnableVisualStyles()
を呼び出してみてください。うまくいくかどうかはわかりませんが、試してみる価値はあります。ただし、これにはSystem.Windows.Formsへの参照が必要です。
私がそれをトリガーした方法として、Formsのものへの通常の参照を「リダイレクト」します(それらは同じように機能しますが、名前が異なります):
using MessageBox = System.Windows.Forms.MessageBox;
using MessageBoxImage = System.Windows.Forms.MessageBoxIcon;
using MessageBoxButton = System.Windows.Forms.MessageBoxButtons;
using MessageBoxResult = System.Windows.Forms.DialogResult;
namespace ... class ...
public MainWindow()
{
InitializeComponent();
System.Windows.Forms.Application.EnableVisualStyles();
}
public void do()
{
// updated style, but good syntax for a later solution
MessageBox.Show("Some Message", "DEBUG", MessageBoxButton.OK, MessageBoxImage.Question);
}
...マニフェストソリューションが機能しませんでした。
新しいマニフェストを作成して貼り付けます:
<?xml version="1.0" encoding="utf-8"?>
<Assembly manifestVersion="1.0" xmlns="urn:schemas-Microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-Microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-Microsoft-com:asm.v3">
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-Microsoft-com:compatibility.v1">
<application>
</application>
</compatibility>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</Assembly>