Frage

Wie wir alle wissen, wenn das Symbol für ein WPF-Fenster nicht definiert wird, wird das Standardsymbol angezeigt wird. Ich möchte ohne Symbol in der Titelleiste eines Fensters angezeigt werden soll. Ich weiß, dass ich ein leeres Bild verwenden könnte, aber dies würde der Text in der Titelleiste dazu führen, nach rechts versetzt werden.

Kennt jemand eine Möglichkeit, vollständig auf das Symbol entfernen?

(Ich habe versucht, für eine ähnliche Frage gesucht, aber nichts gefunden.)

War es hilfreich?

Lösung

Einfache, fügen Sie diesen Code in Ihre Fenster:

[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);
}

Andere Tipps

Während nicht genau eine richtige Lösung, könnten Sie eine der folgenden Dinge versuchen:

  1. Einstellen der Window-Liegenschaften zu Toolwindow wird das Symbol verschwinden, aber die Titelleiste (natürlich) wird kleiner sein.

  2. ein Control für das ganze Fenster schreiben. Je nachdem, ob das Fenster wie ein „echtes“ Fenster schauen hat, würde es viel Aufwand sein, zu versuchen, die Standard-Style in der Vorlage zu erstellen.

Nein, das scheint nicht möglich zu sein. Zitiert aus der Dokumentation der Icon-Eigenschaft ( Hervorhebung von mir):

  

Ein WPF-Fenster zeigt immer ein Symbol Wenn man nicht durch das Setzen Icon versehen ist, WPF wählt ein Symbol basierend angezeigt wird auf den folgenden Regeln:.

     
      
  1. Verwenden Sie das Baugruppensymbol, falls angegeben.
  2.   
  3. Wenn das Assembly-Symbol nicht angegeben ist, verwenden Sie das Standard-Microsoft Windows-Symbol.
  4.   
     

Wenn Sie Icon verwenden, um ein benutzerdefiniertes Fenster Symbol angeben, können Sie das Standardanwendungssymbol wiederherstellen, indem Icon auf null Einstellung.

Also, anscheinend ein völlig transparentes Symbol scheint hier die beste Wahl zu sein. Oder vielleicht hackt um all dies durch die Verwendung Windows API-Funktionen des entsprechenden Stil auf dem Fenster zu setzen. Aber das können stören WPF Fenster-Management.

Ich weiß, das beantwortet wird, aber Rigsby Blog einen Artikel hat, dass zeigt, wie dies zu tun, ohne sich zu verstecken das minimieren / maximieren-Boxen.

Ich fand das war frustrierend mich, wie ich die Artikel wurde mit ( hier und hier aber es hielt alle versteckt die Tasten, wenn die SYSMENU versteckt war, zu helfen, wie ich diese Helfer erstellt, die wie oben Aufruf in OnSourceInitialized gezeigt.

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));
    }

}

Sie können ein leeres PNG-Bild verwenden und an Symbol konvertieren und sie als Symbol für das Fenster !!!

eingeben Bild Beschreibung hier

Mein erster Vorschlag wäre, tut es nicht . In WinForms können Sie Arten von formborderstyles verwenden, um ein Dialogfeld zu erstellen, das kein Symbol hat, aber nur, weil das ist ein Windows-Standard. Nur Formulare mit diesen spezifischen Grenztypen sollten kein Symbol haben; es ist, was die Nutzer erwarten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top