WPF MessageBox стиль окна - PullRequest
       16

WPF MessageBox стиль окна

39 голосов
/ 13 марта 2011

Как применить стиль Windows по умолчанию к стандартному MessageBox в WPF?

Например, когда я выполняю следующий код:

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 ]

57 голосов
/ 13 марта 2011

Согласно этой странице, 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 (установите его в свойствах проекта -> Приложение -> Укажите новый манифест в «Значках и манифесте»).

Если вы запустите свое приложение сейчас, оно должно выглядеть как WinForms- MessageBox.

6 голосов
/ 13 марта 2011

Кроме того, для WPF я бы рекомендовал использовать Extended WPF Toolkit , который имеет WPF-сообщение

6 голосов
/ 13 марта 2011

Причина, по которой WinForms one работает так, как он работает, заключается в том, что визуальные стили включены (то есть с помощью Common Controls v6) в ее функции Main. Если вы удалите вызов System.Windows.Forms.Application.EnableVisualStyles () , то окно сообщения WinForms будет выглядеть так же, как окно WPF.

Этого не происходит для приложения WPF, возможно, потому что все элементы управления WPF отображаются, поэтому нет необходимости использовать новую версию Common Controls.

Вы можете попробовать позвонить EnableVisualStyles() где-нибудь при запуске вашего приложения WPF. Я не знаю, сработает ли это или нет, но стоит попробовать. Для этого потребуется ссылка на System.Windows.Forms.

2 голосов
/ 17 мая 2017

как я его вызвал, «перенаправив» обычные ссылки на формы (они работают одинаково, но названы по-разному):

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);
    }

... Манифестное решение не сработало для меня.

1 голос
/ 27 апреля 2019

Создайте новый манифест и вставьте его:

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