windowsformshost

___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ qstntxt ___

Ich entdecke ein sehr seltsames Verhalten von %code% in WPF. Ich finde, wenn ein WPF-Steuerelement %code% nicht als untergeordnetes Steuerelement hat, dann %code% wird ordnungsgemäß ausgelöst - es wird ausgelöst, wenn das WPF-Steuerelement Fokuspunkte erreicht oder verliert und die Variable %code% wie erwartet umgeschaltet wird ( %code% , wenn das Steuerelement ansteigt Fokus, %code% , wenn der Fokus verloren geht).

Aber, wenn ich ein %code% in WPF hosste, wird das %code% -Ereignis nach einer kurzen Weile nicht mehr sowohl für das WPF-Mutter-Steuerelement als auch für das %code% -Unter-Steuerelement ausgelöst.

Ich kann in MSDN-Dokumentation oder SO warum nicht finden, keinen Grund?

Das ist mein Code:

MainWindow.xaml

%Vor%

MainWindow.xaml.cs

%Vor%

Wenn die Zeilen mit %code% auskommentiert sind, dann ist %code% %code% , wenn das Steuerelement den Fokus erhält, und %code% , wenn das Steuerelement den Fokus verliert.

Wenn die Zeilen mit %code% vorhanden sind, dann ist %code% %code% , bis ich auf das Steuerelement klicke und dann %code% wird %code% und %code% wird auch %code% und dann, egal was ich tue, wird %code% event nie wieder gefeuert.

    
___ answer43809282 ___

Aktualisierte Antwort - 05/11

Optimierte vorherige Lösung zur Unterstützung mehrerer %code% -Elemente in %code% . Aktualisierter Stil, um fokussiertes Steuerelement mit grünem Rand hervorzuheben, wenn die %code% -Eigenschaft %code% ist.

MainWindow.xaml

%Vor%

MainWindow.xaml.cs

%Vor%

Screenshot

Vorherige Antwort - 05/05

Wie Hans Passant im Kommentar erwähnt hat, wird dieses Verhalten dadurch verursacht, dass die %code% und die %code% unterschiedliche Hwnd (s) haben.

Wenn Sie das erste Mal auf das Host-Steuerelement klicken, wird das untergeordnete Steuerelement den Fokus erhalten, und IsKeyboardFocusedWithin wird ordnungsgemäß festgelegt. Sobald das untergeordnete Steuerelement jedoch den Fokus erhält, bemerkt das Betriebssystem den Unterschied in Hwnd und sendet die Nachricht kill-focus an das WPF-Fenster, wodurch wiederum IsKeyboardFocusedWithin als false festgelegt wird.

Was Sie tun können, ist, einen %code% Hook zu Ihrem WPF-Hauptfenster hinzuzufügen und die Nachricht kill-focus zu unterdrücken - nur wenn der %code% -Wert des Host-Controls wahr ist.

Es gibt jedoch einen Nebeneffekt: Wenn Sie vom WPF-Fenster weg wechseln, bleibt der %code% -Wert des Host-Steuerelements möglicherweise wahr. Um dies zu beheben, können Sie einen einfachen Traversaltrick verwenden, um den Fokus zu verschieben, wenn eine mit Fenster versehene Nachricht gesendet wird, und daher die Eigenschaft IsKeyboardFocusedWithin entsprechend dem aktuellen Status aktualisiert hat.

Quellcodebeispiel: Ich habe ein StackPanel anstelle eines Rasters verwendet, um die TextBox (s) anzuzeigen

%Vor%

Und das Ergebnis wird so aussehen:

Mit Fokus

Ohne Fokus

    
___ tag123wpf ___ Windows Presentation Foundation oder WPF ist ein Subsystem zum Rendern von Benutzeroberflächen in Windows-basierten Anwendungen. ___ tag123windowsformhost ___ hilf uns dieses Wiki zu bearbeiten ___ qstnhdr ___ Das Vorhandensein von WindowsFormsHost bewirkt, dass der IsKeyboardFocusWithinChanged höchstens zweimal und nicht mehr ausgelöst wird ___
5
Antworten

Render WPF-Steuerelement über WindowsFormsHost

Ich weiß, dass das standardmäßige WPF-Verhalten WPF-Steuerelemente rendert und dann oben WinForms rendert, aber gibt es irgendeine Möglichkeit, WPF über WindowsFormsHost zu rendern? Bearbeiten : Ich habe auch einen Temp-Hack gefunden. Wen...
12.05.2011, 13:42
1
Antwort

Das Vorhandensein von WindowsFormsHost bewirkt, dass der IsKeyboardFocusWithinChanged höchstens zweimal und nicht mehr ausgelöst wird

Ich entdecke ein sehr seltsames Verhalten von WindowsFormsHost in WPF. Ich finde, wenn ein WPF-Steuerelement WindowsFormsHost nicht als untergeordnetes Steuerelement hat, dann IsKeyboardFocusWithinChanged wird ordnungsgemäß ausgelöst...
15.04.2017, 04:44