Comment appliquer le style Windows par défaut au MessageBox
standard dans WPF?
Par exemple, lorsque j'exécute le code suivant:
MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButton.OKCancel,
MessageBoxImage.Exclamation);
Je reçois une boîte de message:
Mais dans WinForms, tout est OK avec style:
MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButtons.OKCancel,
MessageBoxIcon.Exclamation);
Selon la page this , WPF reprend les anciens styles pour certains des contrôles.
Pour vous en débarrasser, vous devez créer un fichier app.manifest personnalisé (Ajouter -> Nouvel élément -> Fichier manifeste d'application) et y coller le code suivant (juste après le/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>
Ensuite, vous devez compiler votre solution avec ce app.manifest (définissez-le dans les propriétés du projet -> Application -> Pointez sur le nouveau manifeste dans "Icônes et manifeste").
Si vous démarrez votre application maintenant, elle devrait ressembler à WinForms-MessageBox.
Aussi, pour WPF, je recommanderais d'utiliser Extended WPF Toolkit qui a un boîte de message WPF
La raison pour laquelle WinForms fonctionne comme il le fait est que les styles visuels sont activés (c'est-à-dire en utilisant Common Controls v6) dans sa fonction principale. Si vous supprimez l'appel à System.Windows.Forms.Application.EnableVisualStyles () , la boîte de message WinForms ressemblera à celle de WPF.
Cela ne se produit pas pour une application WPF, peut-être parce que tous les contrôles WPF sont rendus, il n'est donc pas nécessaire d'utiliser la nouvelle version des contrôles communs.
Vous pouvez essayer d'appeler EnableVisualStyles()
quelque part au démarrage de votre application WPF. Je ne sais pas si cela fonctionnera ou non, mais ça vaut le coup d'essayer. Cela nécessitera cependant une référence à System.Windows.Forms.
comme je l'ai déclenché, "rediriger" les références habituelles vers les formulaires (ils fonctionnent de la même façon, mais sont nommés différemment):
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);
}
... la solution manifeste n'a pas fonctionné pour moi.
Créez un nouveau manifeste et collez-le:
<?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>