Стиль окна 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]()
Ответы
Ответ 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.
Ответ 3
Кроме того, для WPF я бы рекомендовал использовать Extended WPF Toolkit, который имеет Сообщение WPF
Ответ 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>