29 Stimmen

Ist es möglich, ein WPF-Fenster ohne ein Symbol in der Titelleiste anzuzeigen?

Wie wir alle wissen, wird das Standardsymbol angezeigt, wenn das Symbol für ein WPF-Fenster undefiniert ist. Ich möchte ein Fenster ohne ein Symbol in der Titelleiste anzeigen. Ich weiß, dass ich ein leeres Bild verwenden könnte, aber das würde dazu führen, dass der Text in der Titelleiste nach rechts verschoben wird.

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

(Ich habe versucht, nach einer ähnlichen Frage zu suchen, konnte aber nichts finden).

33voto

Nir Punkte 28685

Fügen Sie einfach diesen Code in Ihr Fenster ein:

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

17voto

Andrej Punkte 951

Das ist zwar keine richtige Lösung, aber Sie könnten eine der folgenden Möglichkeiten ausprobieren:

  1. Wenn Sie die WindowStyle-Eigenschaft auf ToolWindow setzen, verschwindet das Icon, aber die Titelleiste wird (natürlich) kleiner.

  2. Schreiben Sie ein ControlTemplate für das gesamte Fenster. Je nachdem, ob das Fenster wie ein "echtes" Fenster aussehen soll, wäre es ein großer Aufwand, den Standardstil in der Vorlage nachzubilden.

11voto

Brett Ryan Punkte 24930

Ich weiß, dass diese Frage beantwortet ist, aber Dan Rigsby's Blog hat einen Artikel, der zeigt, wie man das macht, ohne die Minimieren/Maximieren-Kästchen auszublenden.

Ich fand dies frustrierend, da ich die Artikel ( aquí y aquí aber es versteckte alle Schaltflächen, wenn das Systemmenü ausgeblendet wurde, um zu helfen, habe ich diesen Helfer erstellt, der wie oben gezeigt in 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));
    }

}

10voto

Joey Punkte 329386

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

Ein WPF-Fenster zeigt immer ein Symbol an. Wenn durch die Einstellung Icon kein Icon zur Verfügung gestellt wird, wählt WPF ein Icon zur Anzeige basierend auf den folgenden Regeln aus:

  1. Verwenden Sie das Baugruppensymbol, falls angegeben.
  2. Wenn das Symbol für die Baugruppe nicht angegeben ist, wird das Standardsymbol von Microsoft Windows verwendet.

Wenn Sie Icon verwenden, um ein benutzerdefiniertes Fenstersymbol anzugeben, können Sie das Standardsymbol der Anwendung wiederherstellen, indem Sie Icon auf null .

Ein völlig transparentes Symbol scheint hier also die beste Lösung zu sein. Oder Sie können das Ganze umgehen, indem Sie die Windows-API-Funktionen verwenden, um den entsprechenden Stil für das Fenster festzulegen. Aber das Mai mit dem Fenstermanagement von WPF interferieren.

6voto

mehdi Punkte 573

Sie können ein leeres png-Bild verwenden, es in ein Symbol umwandeln und es als Symbol für Ihr Fenster festlegen!!!

enter image description here

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X