Wie deaktivierst du Aero Snap in einer Anwendung?

8

Ist es möglich, die automatische Windows-Docking-Funktion von Windows 7 in einer WPF-Anwendung zu deaktivieren?

    
hans 18.03.2010, 14:45
quelle

10 Antworten

13

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!

    
bj0 15.11.2012 17:34
quelle
4

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

%Vor%

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

    
mg007 22.03.2010 05:42
quelle
4

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%     
quoc 05.05.2012 02:35
quelle
3

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.

    
Barn Monkey 11.09.2012 15:23
quelle
2

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%     
anthony 11.07.2011 23:16
quelle
1

Es ist vielleicht nicht die perfekte Lösung für Sie, aber für mich hat das Festlegen der Form als nicht veränderbar den Trick gemacht.

    
jpr 03.05.2011 10:50
quelle
1

DragMove unterbricht den UI-Thread. Dieser Code funktioniert auch.

%Vor%     
Mikolaytis 24.02.2015 12:01
quelle
0

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.

    
Jacob G 18.03.2010 15:50
quelle
0

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%     
Thomas Hummes 25.09.2017 12:33
quelle
-3

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.

    
Fergal Moran 18.03.2010 14:50
quelle

Tags und Links