Ich musste dies kürzlich in einem benutzerdefinierten, resizierbaren ResizeMode = CanResizeWithGrip
WPF-Fenster ohne Fensterdekorationen (keine Titelleiste und Schaltflächen) tun. Ich habe DragMove()
verwendet, um das Fenster zu verschieben, und wenn es von AeroSnap maximiert wird, wird das Fenster unbeweglich und daher an Ort und Stelle verriegelt.
Ich habe die Lösung von Barn Monkey versucht , die teilweise funktioniert hat, aber es würde immer noch die AeroSnap-Grafik anzeigen und die Größe der App ändern Vollbildgröße. Ich habe es unten geändert und jetzt funktioniert es wie erwartet: immer noch veränderbar, aber überhaupt kein AeroSnap.
%Vor%BEARBEITEN:
Es ist eine Weile her, seit ich das geschrieben habe, aber da die Leute sich das immer noch ansehen, werde ich es mit dem, was ich jetzt benutze, aktualisieren. Ich benutze immer noch die selbe Methode, um das Kantenschnappen zu verhindern und meine Fenster zu verschieben, aber ich habe sie jetzt in benutzerdefinierte Behavior<>
-Klassen gepackt, die ich an ein Window
oder UserControl
anhängen kann. Dies macht sie sehr einfach mit MVVM zu verwenden (ich verwende Caliburn Micro).
Die Verhaltensklassen sind:
%Vor%Ich hänge sie dann an mein Dialogfeld Ansichten mit:
an %Vor%Und es funktioniert einfach!
Wenn Sie ein Beispiel für "Haftnotizen" von Win7 geben, haben Sie vielleicht bemerkt, dass es keinen standardmäßigen Fensterrahmen hat. Auf dieser Grundlage kann ich Ihnen nur sagen, dass es keine direkte Möglichkeit gibt, dies zu tun, außer dass Sie ResizeMode="NoResize"
einstellen und das Größenänderungsverhalten manuell handhaben. Es folgt eine sehr einfache, nicht-professionelle Lösung, die ich schnell erstellt habe, um Ihnen den Einstieg zu erleichtern. Sie können jedoch weitere Funktionen hinzufügen, wenn Sie möchten:)
Sie können sogar ein Steuerelement erstellen (im Grunde ein Panel), das innerhalb des übergeordneten Canvas skaliert und verschoben werden kann. Jetzt kann dieses Steuerelement in ein transparent maximiertes Fenster gefüllt werden. Dies gibt Ihnen die Illusion, dass Ihr Steuerelement ein Fenster ist, das nicht auf "Fensterfang" reagiert und nicht andockt!
Hoffe, das hilft.
Grüße,
Mihir Gokani
Ich benutzte Anthony's Lösung für eine Weile, aber wenn Sie ResizeMode wechseln, würde das Fenster vorübergehend die Dimensionierungsgrenze entfernen, was ein wenig nervtötend ist. Hier ist eine andere Lösung. Durch Festlegen des WS_OVERLAPPEDWINDOW-Flags und Entfernen des WS_THICKFRAME-Flags wird die Aero Snap-Funktion für das Fenster deaktiviert, ohne den Größenrahmen vorübergehend zu entfernen. Sie können mit den Stilen experimentieren, um den genauen Stil zu erhalten, den Sie benötigen, aber key entfernt das WS_THICKFRAME-Flag.
%Vor%Ich musste Windows 7 Aero Snapshots / Docks erkennen, um Änderungen an der Fenstergröße in einer WPF-Anwendung zu verhindern. Während meiner Suche stieß ich auf diesen Beitrag und fand die Antwort von anthony sehr hilfreich.
Folgendes ist, was bei mir funktioniert hat.
%Vor% Das XAML des Fensters hatte die Einstellung ResizeMode="CanResizeWithGrip"
.
Bearbeiten :
Meine Antwort war nicht korrekt mit dem Windows 7 Aero Snap. Bjo's Antwort löste elegant das Problem für mich.
Hier ist meine Lösung. Windows wird nicht einrasten, wenn ResizeMode auf ResizeMode.NoResize festgelegt ist. Daher besteht der Trick darin, zuverlässig zu bestimmen, wann ein Ziehen / Verschieben beginnt und endet.
BEARBEITEN: alexandrud hat richtig darauf hingewiesen, dass dies nur für "randlose" Fenster funktioniert (WindowStyle = None in WPF-Begriffen).
Viele Bothans sind gestorben, um uns diese Informationen zu bringen.
%Vor%DragMove unterbricht den UI-Thread. Dieser Code funktioniert auch.
%Vor%Ich habe hier keine Windows 7 Box, also kann ich das nicht testen, aber hier ist was ich versuchen würde:
1- Erstellen Sie ein Testformular und überschreiben Sie die WndProc-Komponente
2- Testen und protokollieren Sie spezifische Nachrichten, die sich auf die Änderung von Size, Position und WindowState beziehen.
3- Bestimmen Sie wenn die Nachrichten, die beim Andocken an das Fenster gesendet werden, eine Kombination aus Size / Position / WindowState sind oder wenn es eine andere, neue Windows 7-Nachricht gibt (5 Minuten Suche haben mir nichts enthüllt) .)
4- Sobald Sie die Nachrichten haben, überprüfen Sie, ob es einen "eindeutigen" Fall gibt, der auftritt.
5- Ändern Sie Ihren Code, um diesen einzigartigen Fall zu berücksichtigen.
Wenn niemand sonst etwas findet, könnte ich dieses Wochenende zu Hause einen Wirbel machen.
Eine ziemlich einfache Lösung, die ich gefunden habe und die auch mit randlosen Fenstern funktioniert: Verstecken Sie einfach die Maximierungsschaltfläche (Ereignis, wenn es aufgrund der fehlenden Titelleiste nicht angezeigt wird):
%Vor%Wählen Sie in Benutzerfreundlichkeit in der Systemsteuerung
Erleichtern Sie es, sich auf Aufgaben zu konzentrieren
und ankreuzen
Verhindern, dass Fenster automatisch angeordnet werden, wenn sie an den Rand des Bildschirms verschoben werden.