WPF MessageBox窗口样式

时间:2011-03-13 12:27:39

标签: c# 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

5 个答案:

答案 0 :(得分:56)

根据this页面,WPF会为某些控件选择旧样式。

要摆脱它,您必须创建一个自定义app.manifest文件(添加 - >新项目 - >应用程序清单文件)并将以下代码粘贴到其中(紧跟在/ trustInfo - 标记之后):

<!-- 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编译你的解决方案(在项目属性中设置它 - &gt;应用程序 - &gt;指向“图标和清单”中的新清单)。

如果您现在启动应用程序,它应该看起来像WinForms- MessageBox。

答案 1 :(得分:6)

WinForms的工作原理是因为在其Main函数中打开了视觉样式(即使用Common Controls v6)。如果删除对System.Windows.Forms.Application.EnableVisualStyles()的调用,则WinForms消息框看起来就像WPF消息框。

对于WPF应用程序不会发生这种情况,可能是因为所有WPF控件都已呈现,因此无需使用新版本的Common Controls。

您可以尝试在启动WPF应用程序的某个地方调用EnableVisualStyles()。我不知道它是否会起作用,但值得一试。但这需要引用System.Windows.Forms。

答案 2 :(得分:6)

另外,对于WPF,我建议使用Extended WPF Toolkit

WPF messagebox

答案 3 :(得分:2)

如我触发它,&#34;重定向&#34;对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);
    }

......清单解决方案对我不起作用。

答案 4 :(得分:1)

创建一个新清单并粘贴:

<?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>