Question

Comme nous le savons tous, si l'icône d'une fenêtre de WPF est définie alors l'icône par défaut est affiché. Je veux afficher une fenêtre sans aucune icône dans la barre de titre. Je me rends compte que je pouvais utiliser une image vierge, mais cela causerait le texte dans la barre de titre à compenser à droite.

Quelqu'un sait-il d'une façon de supprimer complètement l'icône?

(j'ai essayé la recherche d'une question similaire, mais n'a pas pu trouver quoi que ce soit.)

Était-ce utile?

La solution

Simple, ajoutez ce code à votre fenêtre:

[DllImport("user32.dll")]
static extern uint GetWindowLong(IntPtr hWnd, int nIndex);

[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);

private const int GWL_STYLE = -16;

private const uint WS_SYSMENU = 0x80000;

protected override void OnSourceInitialized(EventArgs e)
{
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    SetWindowLong(hwnd, GWL_STYLE,
        GetWindowLong(hwnd, GWL_STYLE) & (0xFFFFFFFF ^ WS_SYSMENU));

    base.OnSourceInitialized(e);
}

Autres conseils

Bien que pas exactement une bonne solution, vous pouvez essayer l'une des choses suivantes:

  1. Réglage de la WindowStyle-propriété à ToolWindow fera disparaître l'icône, mais la barre de titre (évidemment) sera plus petite.

  2. Ecrire un ControlTemplate pour toute la fenêtre. Selon si la fenêtre doit ressembler à une fenêtre « réel », il y aurait beaucoup d'efforts pour essayer de recréer le style par défaut dans le modèle.

Non, cela ne semble pas être possible. Je cite la documentation du Icône propriété ( Souligné par l'auteur):

  .

Une fenêtre WPF affiche toujours une icône Quand on est pas fourni par la mise en icône, WPF choisit une icône pour afficher en fonction des règles suivantes:

     
      
  1. Utilisez l'icône de montage, si cela est spécifié.
  2.   
  3. Si l'icône de l'assemblage n'est pas spécifié, utilisez l'icône par défaut Microsoft Windows.
  4.   
     

Si vous utilisez l'icône pour spécifier une icône de fenêtre personnalisée, vous pouvez restaurer l'icône de l'application par défaut en icône pour null.

Donc, apparemment une icône complètement transparente semble être votre meilleur pari ici. Ou peut-être pirater autour de tout cela en utilisant des fonctions de l'API Windows pour définir le style approprié sur la fenêtre. Mais cette peut interférer avec la gestion des fenêtres de WPF.

Je sais que cela répond, mais Dan blog de Rigsby a un article qui montre comment faire cela sans cacher les boîtes minimiser / maximiser.

J'ai trouvé cela me frustrait que j'utilisais les articles ( et mais il a gardé tout cacher les boutons lorsque le SYSMENU était caché, pour aider, j'ai créé cette aide qui, comme indiqué ci-dessus appel à OnSourceInitialized.

public static class WpfWindowHelper {

    [DllImport("user32.dll")]
    public static extern int GetWindowLong(IntPtr hwnd, int index);
    [DllImport("user32.dll")]
    public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
    [DllImport("user32.dll")]
    public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);

    public const int GWL_EXSTYLE = -20;
    public const int WS_EX_DLGMODALFRAME = 0x0001;
    public const int SWP_NOSIZE = 0x0001;
    public const int SWP_NOMOVE = 0x0002;
    public const int SWP_NOZORDER = 0x0004;
    public const int SWP_FRAMECHANGED = 0x0020;
    public const int GWL_STYLE = -16;
    public const int WS_MAXIMIZEBOX = 0x00010000;
    public const int WS_MINIMIZEBOX = 0x00020000;
    public const int WS_SYSMENU = 0x00080000;

    public static void HideSysMenu(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
        SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);
        SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    }

    public static void HideMinimizeBox(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE,
            GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MINIMIZEBOX));
    }

    public static void HideMaximizeBox(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE,
            GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MAXIMIZEBOX));
    }

    public static void HideMinimizeAndMaximizeBoxes(this Window w) {
        IntPtr hwnd = new WindowInteropHelper(w).Handle;
        SetWindowLong(hwnd, GWL_STYLE,
            GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX));
    }

}

Vous pouvez utiliser une image vide et .png convertir en icône et le définir comme icône de votre fenêtre !!!

entrer image description ici

Ma première suggestion serait ne le font pas . Dans WinForms, vous pouvez utiliser les types de formborderstyles pour créer une boîte de dialogue qui n'a pas d'icône, mais seulement parce que c'est un standard de Windows. Seuls les formulaires avec ces types de frontières spécifiques devraient avoir aucune icône; c'est ce que les utilisateurs attendent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top