web-dev-qa-db-ja.com

WPF MessageBoxウィンドウスタイル

デフォルトのWindowsスタイルをWPFの標準MessageBoxに適用する方法は?

たとえば、次のコードを実行すると:

MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButton.OKCancel, 
    MessageBoxImage.Exclamation);

メッセージボックスが表示されます。

enter image description here

しかし、WinFormsでは、スタイルに問題はありません。

MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButtons.OKCancel, 
    MessageBoxIcon.Exclamation);

enter image description here

39
Kyrylo M

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のようになります。

58
Gimno

また、WPFの場合、 WPFメッセージボックス を持つ Extended WPF Toolkit を使用することをお勧めします。

6
gcores

WinFormsが動作する理由は、Main関数で視覚スタイルがオンになっている(つまり、Common Controls v6を使用している)ためです。 System.Windows.Forms.Application.EnableVisualStyles() への呼び出しを削除すると、WinFormsメッセージボックスはWPFのようになります。

これは、おそらくすべてのWPFコントロールがレンダリングされるため、新しいバージョンのCommon Controlsを使用する必要がないため、WPFアプリでは発生しません。

WPFアプリケーションの起動時にどこかでEnableVisualStyles()を呼び出してみてください。うまくいくかどうかはわかりませんが、試してみる価値はあります。ただし、これにはSystem.Windows.Formsへの参照が必要です。

6
Andy

私がそれをトリガーした方法として、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);
    }

...マニフェストソリューションが機能しませんでした。

2
BananaAcid

新しいマニフェストを作成して貼り付けます:

<?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>
1
Marco Concas