web-dev-qa-db-fra.com

Style de fenêtre WPF MessageBox

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:

enter image description here

Mais dans WinForms, tout est OK avec style:

MessageBox.Show("Hello Stack Overflow!", "Test", MessageBoxButtons.OKCancel, 
    MessageBoxIcon.Exclamation);

enter image description here

41
Kyrylo M

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.

60
Gimno

Aussi, pour WPF, je recommanderais d'utiliser Extended WPF Toolkit qui a un boîte de message WPF

6
gcores

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.

6
Andy

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.

4
BananaAcid

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>
1
Marco Concas