Sie müssen die Ereignisauslösung in diesem WPF-Programm verstehen. .

8

Ich versuche SharpDX zu lernen, indem ich ein Beispielprogramm verwende ( Ссылка ). Es erstellt einen Quadranten von 4 schattierten Dreiecken mit 4 verschiedenen Ansätzen und es läuft nur von selbst die Grafik neu zeichnen. Es läuft kontinuierlich und scheint ereignisgesteuert zu sein, da ich kontinuierlich Breakpoints in Event-Handlern trage (siehe unten), aber ich verstehe nicht, was diese Ereignisse auslöst. In der XAML hat es. . .

%Vor%

. . .

%Vor%

. . . Wo die Deklaration und der Konstruktor von DXElement so aussehen  . . .

%Vor%

Der Rest von DXElement ist nur ein kurzer Event-Handler. Hier ist ein Beispiel:

%Vor%

Beachten Sie die "Überschreibung". Ich nehme an, dass eine der Elternklassen von DXElement (FrameworkElement oder INotifyPropertyChanged) bereits auf diese Ereignisse wartet. Aber was löst diese Ereignisse aus? (z. B. OnRender () , OnLoopRendering () usw.) Sie scheinen die Engine zu sein, die das Programm ausführt. Wie kann ich verfolgen, wie Ereignisse wie diese in einem WPF-Programm ausgelöst werden? Wenn ich einen Haltepunkt bei ihnen setze, sehe ich, dass sie getroffen werden, aber sie werden vom Framwork aufgerufen, z. B.

  

SharpDX.WPF.dll! SharpDX.WPF.DXElement.OnRender (System.Windows.Media.DrawingContext   dc) Linie 153 C #   PresentationCore.dll! System.Windows.UIElement.Arrange (System.Windows.Rect   finalRect) Unbekannt   PresentationFramework.dll! System.Windows.Controls.Grid.ArrangeOverride (System.Windows.Size   arraySize) Unbekannt   PresentationFramework.dll! System.Windows.FrameworkElement.ArrangeCore (System.Windows.Rect   finalRect) Unbekannt   PresentationCore.dll! System.Windows.UIElement.Arrange (System.Windows.Rect   finalRect) Unbekannt   PresentationFramework.dll! MS.Internal.Helper.ArrangeElementWithSingleChild (System.Windows.UIElement   Element, System.Windows.Size arraySize) Unbekannt   PresentationFramework.dll! System.Windows.Controls.ContentPresenter.ArrangeOverride (System.Windows.Size   arraySize) Unbekannt

... deshalb verstehe ich nicht, was das Programm tut, um diese Ereignisse passieren zu lassen. Wie finde ich das heraus?

    
user316117 15.04.2016, 15:53
quelle

2 Antworten

5

Sie verwenden das Rendering pro Frame mit dem globalen Ereignis CompositionTarget.Rendering . Es wird einmal pro Frame für alle Abonnenten aufgerufen. Sie können mehr Details darüber hier lesen: Ссылка .

Beim DXElement-Quellcode wird die Renderer-Abhängigkeitseigenschaft angezeigt. Im Eigenschaftenänderungs-Handler für diese Eigenschaft sehen Sie, wie sie das erwähnte CompositionTarget.Rendering -Ereignis abonnieren, wenn einige Bedingungen übereinstimmen (das Steuerelement ist sichtbar, nicht im Entwurfsmodus usw.). Sie starten auch Stopwatch , um zu messen, wie viel Zeit seit Beginn vergangen ist, und rendern dann den Rahmen.

Wie für den OnRender-Handler, den Sie erwähnt haben. Dieser wird unter bestimmten Bedingungen während des Layout-Durchlaufs aufgerufen (wenn übergeordnete Steuerelemente festlegen, wie die untergeordneten Elemente angeordnet werden sollen). Es wird einmal aufgerufen, wenn DXElement zum ersten Mal gerendert wird, dann wird es aufgerufen, wenn Sie beispielsweise die Größe von DXElement ändern oder InvalidateVisual darauf aufrufen. Es wird jedoch nicht aufgerufen, wenn diese Dreiecke in Ihrem Beispiel die Farbe ändern - dies geschieht mit CompositionTarget.Rendering event.

Eine kurze Antwort auf Ihre Frage wäre - alle in Ihrem Beispiel verwendeten Ereignisse werden vom WPF-Rendering-System ausgelöst.

    
Evk 18.04.2016 17:04
quelle
1

Eine grobe Vermutung ist, dass es aufruft InvalidateVisual () innerhalb eines wiederkehrenden Timers, der zu einem bestimmten Zeitpunkt OnRender () .

    
Aybe 15.04.2016 16:05
quelle

Tags und Links