Frage

Hintergrund:Ich habe eine kleine App zum Abspielen von Videos mit einer Benutzeroberfläche, die vom ehrwürdigen Sasami2k inspiriert ist und gerade aktualisiert wurde, um VMR9 zu verwenden (d. h.Direct3D9 mit DirectShow) und weniger instabil sein.Derzeit handelt es sich aus Notwendigkeit um eine C++-App, die rohes Win32 verwendet:Keines der verschiedenen Toolkits ist überhaupt etwas wert.Insbesondere WPF war aufgrund der Luftraumbeschränkungen nicht möglich.

OK, jetzt, da D3DImage existiert, könnte es sinnvoll sein, D3D/VMR9/DirectShow und WPF zu kombinieren.Angesichts früherer Frustrationen über die Unerweiterbarkeit von Win32 scheint dies eine gute Sache zu sein.

Aber wissen Sie, ich falle schon bei der ersten Hürde.

Mit Win32 habe ich (sehr einfach) ein randloses Fenster erstellt, dessen Größe geändert werden kann, dessen Größe sich proportional ändert, an den Bildschirmrändern einrastet und im maximierten Zustand den gesamten Bildschirm (einschließlich Taskleistenbereich) einnimmt.Da es sich um eine Video-App handelt, sind das alles ziemlich wünschenswerte Eigenschaften.

OK, also, wie macht man dasselbe mit WPF?

Unter Win32 verwende ich:WM_getMinmaxinfo, um das Maximierungsverhalten zu steuern.

Wenn ich mir jedoch WPF ansehe, scheint es, dass die verschiedenen Ereignisse zu spät eintreffen, es sei denn, ich verstehe die Dokumentation falsch?

Ich weiß zum Beispiel nicht, wann ich mitten in der Bewegung bin, da LocationChanged angibt, dass es erst ausgelöst wird, wenn das Fenster verschoben wurde (was zu spät ist).Ebenso scheint es, dass StateChanged erst dann ausgelöst wird, wenn das Fenster wiederhergestellt/maximiert wurde (wenn ich die Informationen vor der Maximierung benötige, um dem System die richtige Maximierungsgröße mitzuteilen).

Und ich scheine völlig zu übersehen, wo das System mich über Größenänderungen informiert.Ebenso die Trefferprüfung.

Also, ähm, übersehe ich hier etwas oder habe ich keine andere Wahl, als mich trotzdem wieder dem Wndproc dieses Dings zuzuwenden?Kann ich tun, was ich will, ohne WndProc einzubinden?

Wenn ich WndProc verwenden muss, kann ich genauso gut bei meiner vorhandenen Codebasis bleiben;Ich möchte einen einfacheren, saubereren UI-Code haben, und die Abkehr vom WndProc ist dafür von grundlegender Bedeutung.

Wenn ich den WndProc einbinden muss, muss ich mich fragen:Warum?Win32 verfügt über die Fenstermeldungen „Sizing/Size“, „Moving/Moved“, „Poschanging/Poschanged“ und sie sind alle nützlich.Warum repliziert WPF nicht dieselben Ereignisse?Es scheint eine unnötige Lücke in der Funktionalität zu sein.

Außerdem bedeutet dies, dass WPF an eine bestimmte USER32-abhängige Implementierung gebunden ist.Das bedeutet, dass MS (z. B. in Windows 7 oder 8) die Anzeigeebene nicht umkehren kann, um WPF „nativ“ zu machen und HWNDs und WndProcs für ältere Apps zu emulieren – obwohl MS genau das tun sollte.

War es hilfreich?

Lösung

Und ich scheine völlig zu übersehen, wo das System mich über Größenänderungen informiert.Ebenso die Trefferprüfung.

Für die Größenänderung fehlt Ihnen tatsächlich das Größe geändert Ereignis.AFAIK gibt es leider kein OnSizeChanging-, OnLocationChanging- und OnStateChanging-Ereignis auf einem Fenster in .NET


Ich habe das gesehen, aber soweit ich weiß, wird es erst ausgelöst, nachdem sich die Größe geändert hat, während das Ereignis während der Größenänderung ausgelöst werden muss.Es sei denn, ich lese die Dokumente falsch und sie feuert tatsächlich kontinuierlich ab?

Es feuert nicht kontinuierlich, aber Sie können es wahrscheinlich verwenden ResizeBegin Und ResizeEnd Veranstaltungen und in der Lage sein, das zu tun.


Handelt es sich nicht um WinForms-Ereignisse?

Hmm, du hast recht.

Andere Tipps

OK, um meine eigene Frage zu beantworten: Ich habe Adorners vermisst (ich bin bei keiner meiner Suchanfragen zurückgekommen, daher scheint es nicht, dass sie so bekannt sind, wie sie vielleicht sein sollten).

Sie scheinen leider etwas komplexer zu sein als die WndProc-Überschreibungen, aber ich denke, es sollte möglich sein, sie so zu manipulieren, dass sie das tun, was ich will.

Im Code können Sie die WindowStyle-Eigenschaft auf „None“ und WindowsState auf „Maximized“ festlegen.

Ich bin mir nicht sicher, wie das Xaml aussehen würde.

Können Sie möglicherweise ArrangeOverride und/oder MeasureOverride überschreiben, um die fehlenden Größenänderungsereignisse auszugleichen?„Measure“ ist der erste Durchgang und erfolgt, wenn ein Layout an eine neue Größe angepasst werden muss. Es handelt sich also um eine Art Größenänderungsereignis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top