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).

0voto

antikbd Punkte 569

Fügen Sie den folgenden Code in die Hauptklasse Ihrer Window um die Schaltflächen zum Maximieren und Minimieren zu entfernen und das Symbol auszublenden.

private const uint WS_MINIMIZEBOX = 0x00020000;
private const uint WS_MAXIMIZEBOX = 0x00010000;
private const int GWL_STYLE = -16;
private const int GWL_EXSTYLE = -20;
private const int SWP_NOSIZE = 0x0001;
private const int SWP_NOMOVE = 0x0002;
private const int SWP_NOZORDER = 0x0004;
private const int SWP_FRAMECHANGED = 0x0020;
private const int WM_SYSCOMMAND = 0x0112;
private const int WM_SETICON = 0x0080;
private const int WS_EX_DLGMODALFRAME = 0x0001;

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]
private static extern uint GetWindowLong(IntPtr hwnd, int index);

[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hwnd, int index, uint newStyle);

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

protected override void OnSourceInitialized(EventArgs e)
{
    base.OnSourceInitialized(e);

    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    uint styles = GetWindowLong(hwnd, GWL_STYLE);

    // Remove the maximize and minimize buttons
    styles &= 0xFFFFFFFF ^ (WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
    SetWindowLong(hwnd, GWL_STYLE, styles);

    // Change to dialog modal - necessary for the final step to work!
    styles = GetWindowLong(hwnd, GWL_EXSTYLE);
    styles |= WS_EX_DLGMODALFRAME;
    SetWindowLong(hwnd, GWL_EXSTYLE, styles);

    SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    ((HwndSource)PresentationSource.FromVisual(this)).AddHook(HelpButtonHook);

    // Remove the icon
    SendMessage(hwnd, WM_SETICON, new IntPtr(1), IntPtr.Zero);
    SendMessage(hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero);
}

-3voto

Neil Barnwell Punkte 39692

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

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