Ich schreibe einen modalen Dialog in WPF. Wie stelle ich ein WPF-Fenster so ein, dass es keine Schaltfläche zum Schließen gibt? Ich hätte immer noch gerne WindowState
eine normale Titelleiste.
Ich fand ResizeMode
, WindowState
und WindowStyle
, aber keine dieser Eigenschaften erlauben Sie mir , die Schließen - Schaltfläche zu verstecken , aber die Titelleiste zeigen, wie in modalen Dialogen.
Antworten:
WPF verfügt nicht über eine integrierte Eigenschaft zum Ausblenden der Schaltfläche Schließen in der Titelleiste. Sie können dies jedoch mit ein paar Zeilen P / Invoke tun.
Fügen Sie zunächst Ihre Deklarationen zu Ihrer Window-Klasse hinzu:
Fügen Sie dann diesen Code in das
Loaded
Ereignis des Fensters ein :Und los geht's: keine Schaltfläche mehr schließen. Sie haben auch kein Fenstersymbol auf der linken Seite der Titelleiste, was bedeutet, dass kein Systemmenü angezeigt wird, selbst wenn Sie mit der rechten Maustaste auf die Titelleiste klicken - alle gehören zusammen.
Beachten Sie, dass Alt+ F4das Fenster weiterhin schließt. Wenn Sie nicht möchten, dass das Fenster geschlossen wird, bevor der Hintergrund-Thread fertig ist, können Sie es auch überschreiben
OnClosing
undCancel
auf true setzen, wie Gabe vorgeschlagen hat.quelle
SetWindowLongPtr
stattdessen verwenden.Ich bin gerade zu einem ähnlichen Problem gekommen und Joe Whites Lösung scheint mir einfach und sauber zu sein. Ich habe es wiederverwendet und als angehängte Eigenschaft von Window definiert
Dann setzen Sie es in XAML einfach so:
quelle
Setzen Sie die
WindowStyle
Eigenschaft auf Keine, wodurch das Kontrollfeld zusammen mit der Titelleiste ausgeblendet wird. Keine Notwendigkeit für kernale Anrufe.quelle
this.DragMove();
zumMouseDown
Ereignis des Fensters hinzufügenDadurch wird die Schaltfläche zum Schließen nicht entfernt, aber es wird verhindert, dass jemand das Fenster schließt.
Fügen Sie dies in Ihren Code hinter der Datei ein:
quelle
Window
als modaler Dialog eingerichteten Dialog dieWindow
Einstellung seinerDialogResult
Eigenschaft beeinträchtigt und möglicherweise unbrauchbar macht. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfUm die Schaltfläche zum Schließen zu deaktivieren, sollten Sie Ihrer Window-Klasse den folgenden Code hinzufügen (der Code wurde von hier übernommen , bearbeitet und ein wenig neu formatiert):
Dieser Code deaktiviert auch das Schließen des Elements im Systemmenü und das Schließen des Dialogfelds mit Alt + F4.
Möglicherweise möchten Sie das Fenster programmgesteuert schließen. Nur anrufen
Close()
wird nicht funktionieren. Mach so etwas:quelle
Ich habe Viachaslaus Antwort versucht, da mir die Idee gefällt, die Schaltfläche nicht zu entfernen, sondern zu deaktivieren, aber aus irgendeinem Grund hat es nicht immer funktioniert: Die Schaltfläche zum Schließen war immer noch aktiviert, aber es gab keinerlei Fehler.
Dies hat andererseits immer funktioniert (Fehlerprüfung weggelassen):
quelle
Window
Erweiterungsmethode in meinem Projekt hinzugefügt .Die festzulegende Eigenschaft ist =>
WindowStyle="None"
quelle
Ich füge nur meine Implementierung der Antwort von Joe White mithilfe des Interaktivitätsverhaltens hinzu (Sie müssen auf System.Windows.Interactivity verweisen).
Code:
Verwendung:
quelle
Lassen Sie den Benutzer das Fenster "schließen", aber verstecken Sie es wirklich einfach.
Blenden Sie im OnClosing-Ereignis des Fensters das Fenster aus, falls es bereits sichtbar ist:
Zeigen Sie jedes Mal, wenn der Hintergrund-Thread ausgeführt werden soll, das Hintergrund-UI-Fenster erneut an:
Stellen Sie beim Beenden der Programmausführung sicher, dass alle Fenster geschlossen sind / geschlossen werden können:
quelle
Also, so ziemlich hier ist dein Problem. Die Schaltfläche zum Schließen oben rechts in einem Fensterrahmen ist nicht Teil des WPF-Fensters, gehört jedoch zu dem Teil des Fensterrahmens, der von Ihrem Betriebssystem gesteuert wird. Dies bedeutet, dass Sie Win32 Interop verwenden müssen, um dies zu tun.
Alternativ können Sie den Noframe verwenden und entweder Ihren eigenen "Frame" bereitstellen oder überhaupt keinen Frame haben.
quelle
Im Folgenden werden die Schaltflächen zum Schließen und Maximieren / Minimieren deaktiviert. Die Schaltflächen werden jedoch nicht entfernt (die Menüelemente werden jedoch entfernt!). Die Schaltflächen in der Titelleiste sind deaktiviert / grau gezeichnet. (Ich bin nicht ganz bereit, alle Funktionen selbst zu übernehmen ^^)
Dies unterscheidet sich geringfügig von der Virgoss-Lösung darin, dass die Menüelemente (und ggf. das nachfolgende Trennzeichen) entfernt werden, anstatt sie nur zu deaktivieren. Es unterscheidet sich von der Joe Whites-Lösung, da es nicht das gesamte Systemmenü deaktiviert und ich in meinem Fall die Schaltfläche und das Symbol "Minimieren" beibehalten kann.
Der Nachfolger Code unterstützt auch die Maximize deaktivieren / Minimieren Tasten wie, anders als die Schaltfläche Schließen aus dem Menü die Einträge entfernt das System nicht dazu führt , die Tasten „disabled“ selbst zu machen , wenn die Menüeinträge zu entfernen tut deaktivieren die Funktionalität der Tasten.
Für mich geht das. YMMV.
Verwendung: Dies muss erfolgen, nachdem die Quelle initialisiert wurde. Ein guter Ort ist die Verwendung des SourceInitialized-Ereignisses des Fensters:
Um die Alt + F4-Funktionalität zu deaktivieren, besteht die einfache Methode darin, das Ereignis "Abbrechen" zu verkabeln und ein Flag zu setzen, wenn Sie das Fenster wirklich schließen möchten.
quelle
XAML-Code
sollte arbeiten
Bearbeiten - für Ihren Moment zeigt dieser Thread , wie das gemacht werden kann, aber ich glaube nicht, dass Window eine Eigenschaft hat, um das zu bekommen, was Sie wollen, ohne die normale Titelleiste zu verlieren.
Bearbeiten 2 Dieser Thread zeigt eine Möglichkeit, dies zu tun, aber Sie müssen Ihren eigenen Stil auf das Systemmenü anwenden, und es zeigt eine Möglichkeit, wie Sie dies tun können.
quelle
Versuchen Sie, dem Fenster ein Abschlussereignis hinzuzufügen. Fügen Sie diesen Code dem Ereignishandler hinzu.
Dadurch wird verhindert, dass das Fenster geschlossen wird. Dies hat den gleichen Effekt wie das Ausblenden der Schaltfläche zum Schließen.
quelle
Verwenden Sie diese Option, geändert von https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
quelle
Dies verbirgt die Schaltfläche nicht, verhindert jedoch, dass sich der Benutzer vorwärts bewegt, indem das Fenster geschlossen wird.
quelle
gehe zu Fenstereigenschaften eingestellt
Du wirst keine engen Knöpfe bekommen ...
quelle
WindowStyle = "None"
- achten Sie auf Ihre Syntax. Zum anderen handelt es sich um einen Shotgun-Ansatz, bei dem auch die Titelleiste entfernt wird, wodurch die Box hässlich wird und kein Titel mehr vorhanden ist, wenn es so viele bessere Möglichkeiten gibt, damit umzugehen (wie aus den anderen Antworten hervorgeht), und es handelt sich um eine doppelte Antwort.Wie in anderen Antworten angegeben, können Sie
WindowStyle="None"
die Titelleiste vollständig entfernen.Und wie in den Kommentaren zu diesen anderen Antworten angegeben, verhindert dies, dass das Fenster ziehbar ist, so dass es schwierig ist, es aus seiner ursprünglichen Position zu bewegen.
Sie können dies jedoch überwinden, indem Sie dem Konstruktor in der Code Behind-Datei des Fensters eine einzelne Codezeile hinzufügen:
Oder wenn Sie die Lambda-Syntax bevorzugen:
Dies macht das gesamte Fenster ziehbar. Alle im Fenster vorhandenen interaktiven Steuerelemente, z. B. Schaltflächen, funktionieren weiterhin wie gewohnt und fungieren nicht als Ziehpunkte für das Fenster.
quelle
Nachdem ich viel nach der Antwort darauf gesucht hatte, arbeitete ich diese einfache Lösung aus, die ich hier in der Hoffnung teilen werde, dass sie anderen hilft.
Ich setze
WindowStyle=0x10000000
.Hiermit werden die Werte
WS_VISIBLE (0x10000000)
undWS_OVERLAPPED (0x0)
für den Fensterstil festgelegt. "Überlappt" ist der erforderliche Wert, um die Titelleiste und den Fensterrand anzuzeigen. Durch das EntfernenWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
undWS_SYSMENU (0x80000)
Werte von meinem Stil Wert, sind alle Tasten aus der Titelleiste entfernt wurden, einschließlich der Schaltfläche Schließen.quelle
WindowStyle
befindet sich eine Aufzählung, deren Werte nicht mit den Windows-API-Konstanten übereinstimmen. Das Erzwingen des Werts zurWindowStyle
Aufzählung funktioniert nicht. Natürlich habe ich den .NET-Quellcode in ILSpy überprüft. Der Enum-Wert wird in der privaten Funktion in die Windows-API übersetzt.CreateWindowStyle
Wenn die Funktion auf einen unbekanntenWindowStyle
Wert stößt , gilt er einfachWindowStyle.None
. (Der einzige Weg wäre, die internen Eigenschaften_Style
und_StyleEx
die Reflexion zu verwenden, von denen ich dringend empfehle.)Verwenden Sie
WindowStyle="SingleBorderWindow"
diese Option, um die Max- und Min-Schaltflächen im WPF-Fenster auszublenden.quelle
close
Knopf zu versteckenWenn der Benutzer nur daran gehindert werden soll, das Fenster zu schließen, ist dies eine einfache Lösung.
XAML-Code:
IsCloseButtonEnabled="False"
quelle