Wenn Sie ResizeMode="CanResizeWithGrip"
ein WPF Window
festlegen, wird in der unteren rechten Ecke ein Größenänderungsgriff angezeigt (siehe unten):
Wenn Sie ebenfalls festlegen, WindowStyle="None"
verschwindet die Titelleiste, aber die grau abgeschrägte Kante bleibt bis zum Festlegen erhalten ResizeMode="NoResize"
. Leider verschwindet mit dieser Kombination von Eigenschaften auch der Größenänderungsgriff.
Ich habe die Window
's ControlTemplate
über einen Brauch überschrieben Style
. Ich möchte den Rand des Fensters selbst angeben, und ich brauche keine Benutzer, um die Größe des Fensters von allen vier Seiten ändern zu können, aber ich brauche einen Griff zum Ändern der Größe.
Kann jemand einen einfachen Weg beschreiben, um all diese Kriterien zu erfüllen?
- Haben Sie keinen Rand
Window
neben dem, den ich selbst in a angegeben habeControlTemplate
. - Haben Sie in der unteren rechten Ecke einen funktionierenden Größenänderungsgriff.
- Ich habe keine Titelleiste.
quelle
Antworten:
Wenn Sie die
AllowsTransparency
Eigenschaft auf festlegenWindow
(auch ohne Transparenzwerte festzulegen), verschwindet der Rahmen und Sie können die Größe nur über den Griff ändern.Ergebnis sieht aus wie:
quelle
Ich habe versucht, ein randloses Fenster mit zu erstellen,
WindowStyle="None"
aber als ich es getestet habe, scheint oben ein weißer Balken zu erscheinen. Nach einigen Recherchen scheint es sich um einen "Rand der Größe ändern" zu handeln. Hier ist ein Bild (ich habe es gelb bemerkt):Nach einigen Recherchen über das Internet und vielen schwierigen Nicht-XAML-Lösungen, allen Lösungen, die ich gefunden habe, war Code hinter C # und vielen Codezeilen, habe ich hier indirekt die Lösung gefunden: Maximales benutzerdefiniertes Fenster verliert Schlagschatteneffekt
Hinweis : Sie müssen das .NET 4.5-Framework verwenden. Wenn Sie eine ältere Version verwenden, verwenden Sie WPFShell. Verweisen Sie einfach auf die Shell und verwenden Sie
Shell:WindowChrome.WindowChrome
stattdessen.Ich habe die
WindowChrome
Eigenschaft von Window verwendet. Wenn Sie diese Eigenschaft verwenden, verschwindet der weiße "Größenänderungsrand", aber Sie müssen einige Eigenschaften definieren, um korrekt zu funktionieren.CaptionHeight: Dies ist die Höhe des Beschriftungsbereichs (Kopfleiste), die das Aero-Snap-Doppelklickverhalten wie bei einer normalen Titelleiste ermöglicht. Setzen Sie diesen Wert auf 0 (Null), damit die Tasten funktionieren.
ResizeBorderThickness: Dies ist die Dicke am Rand des Fensters, an der Sie die Größe des Fensters ändern können. Ich setze auf 5, weil ich diese Zahl mag und weil es schwierig ist, die Fenstergröße zu ändern, wenn man Null setzt.
Nach Verwendung dieses Funktionscodes ist das Ergebnis:
Und jetzt verschwand der weiße Rand ohne Verwendung
ResizeMode="NoResize"
undAllowsTransparency="True"
zeigt auch einen Schatten im Fenster.Später werde ich erklären, wie man die Schaltflächen (ich habe keine Bilder für die Schaltflächen verwendet) einfach mit einfachem und kurzem Code bearbeitet. Ich bin neu und denke, dass ich in Codeprojekt posten kann, weil ich hier den Ort nicht gefunden habe um das Tutorial zu posten.
Vielleicht gibt es eine andere Lösung (ich weiß, dass es harte und schwierige Lösungen für Noobs wie mich gibt), aber dies funktioniert für meine persönlichen Projekte.
Hier ist der vollständige Code
Danke dir!
quelle
Rectangle_PreviewMouseDown
Ereignisses richtig interpretiere .Obwohl die akzeptierte Antwort sehr wahr ist, möchte ich nur darauf hinweisen, dass AllowTransparency einige Nachteile hat. Untergeordnete Fenstersteuerelemente, z. B. WebBrowser, werden nicht angezeigt, und normalerweise wird das Rendern von Software erzwungen, was negative Leistungseffekte haben kann.
Es gibt jedoch eine bessere Lösung.
Wenn Sie ein Fenster ohne Rahmen erstellen möchten, dessen Größe geändert werden kann und das ein WebBrowser-Steuerelement oder ein Frame-Steuerelement hosten kann, das auf eine URL verweist, die Sie einfach nicht konnten, wird der Inhalt dieses Steuerelements leer angezeigt.
Ich habe jedoch eine Problemumgehung gefunden. Wenn Sie im Fenster den WindowStyle auf None, ResizeMode auf NoResize setzen (bitte beachten Sie, dass Sie die Größe nach Abschluss noch ändern können), stellen Sie sicher, dass Sie UNCHECKED AllowsTransparency haben. Sie haben ein statisch großes Fenster ohne Rahmen und werden angezeigt die Browsersteuerung.
Jetzt möchten Sie wahrscheinlich immer noch in der Lage sein, die Größe zu ändern, oder? Nun, dazu können wir mit einem Interop-Anruf:
Und voila, ein WPF-Fenster ohne Rand und dennoch beweglich und in der Größe veränderbar, ohne die Kompatibilität mit Steuerelementen wie WebBrowser zu verlieren
quelle
private enum ResizeDirection { Left = 61441, Right = 61442, Top = 61443, TopLeft = 61444, TopRight = 61445, Bottom = 61446, BottomLeft = 61447, BottomRight = 61448, }
Beispiel hier:
quelle
Ich hatte Schwierigkeiten, die Antwort von @ fernando-aguirre zu bekommen, um
WindowChrome
zu arbeiten. Es war nicht in meinem Fall arbeiten , weil ich überschreibenOnSourceInitialized
in derMainWindow
und nicht die Basisklasse Methode aufrufen.Das hat mich sehr lange verblüfft.
quelle