Подтвердить что ты не робот

Стиль окна WPF MessageBox

Как применить стиль 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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 4

как я вызвал его, "перенаправляя" обычные ссылки на 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);
    }

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

Ответ 5

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

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