2016-04-15 30 views
8

私はSharpDXのサンプルプログラム(http://sharpdxwpf.codeplex.com/SourceControl/latest#SharpDX.WPF.sln)を使って勉強しようとしています...それは4つの異なるアプローチを使って4つの影付き三角形の象限を作成し、それ自体がグラフィックスを再描画するだけです。私はイベントハンドラでブレークポイントを連続して打つため(下記参照)、これらのイベントをトリガするのはわかりません。 XAMLにはそれがあります。 。 。このWPFプログラムでイベントトリガを理解する必要があります。 。

xmlns:dxc="clr-namespace:SharpDX.WPF;assembly=SharpDX.WPF" 

。 。 。

<dxc:DXElement Grid.Column="0" Grid.Row="0" x:Name="dxview10"/> 
<Image Grid.Column="1" Grid.Row="0" x:Name="img"/>  
<dxc:DXElement Grid.Column="0" Grid.Row="1" x:Name="dxview11"/> 
<dxc:DXElement Grid.Column="1" Grid.Row="1" x:Name="dxview2d"/> 

。 。 。 DXElementの宣言とコンストラクタは次のようになります 。 。 。

残りのDXElementは簡単なイベントハンドラです。ここに1つの例があります:

protected override void OnRender(DrawingContext dc) 
{ 
    dc.DrawImage(Surface, new Rect(RenderSize)); 
} 

「オーバーライド」に注意してください。私は、DXElement(FrameworkElementまたはINotifyPropertyChanged)の親クラスの1つが既にこれらのイベントをリスンしていると仮定しています。しかし、これらのイベントを引き起こしますか? (例えば、OnRender(),OnLoopRendering()など)これらは、プログラムを実行するエンジンのようです。このようなイベントがWPFプログラムで発生する原因を追跡するにはどうすればよいですか?私はそれらにブレークポイントを設定した場合 は、私は彼らがヒットの取得を参照してください、しかし、彼らは(System.Windows.Media例えば、

SharpDX.WPF.dll!SharpDX.WPF.DXElement.OnRender、framweworkから呼び出されています.DrawingContext DC)ライン153のC# PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)不明 PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize)不明 PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect)不明 PresentationCore.dll !System.Windows.UIElement.Arrange(System.Windows.Rect finalRect)不明 PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement 要素、System.Windows.Size arrangeSize)不明 PresentationFramework。

未知のdll!System.Windows.Controls.ContentPresenter.ArrangeOverride(System.Windows.Size arrangeSize)...ので、私はプログラムは、これらのイベントを実現するためにやっていることを理解していません。私はそれをどのように把握するのですか?

答えて

1

おおよその推測は、ある時点でOnRender()を呼び出すリカレントタイマー内からInvalidateVisual()を呼び出していることです。

+0

私は "InvalidateVisual"のソリューション全体でファイル内検索を行い、0ヒットを得ました。したがって、プログラムから間接的に呼び出されるフレームワーク内の何かから呼び出されない限り、そうではないようです。これがWPFプログラムのイベントを追跡し、何が起きているのかを確認する方法を探している理由です。それ、どうやったら出来るの? – user316117

+0

https://snoopwpf.codeplex.com/を使用できますが、そのような低レベルのイベントは返されません。おそらくXAMLSpy(未テスト)です。 Reshaperをお持ちの場合は、Shift + F12キーを使用してそのメソッドの用途を見つけることができます。 – Aybe

+0

私はXAMLSpyを試しましたが、私のプログラムを見つけることができませんでした。私はResharperを持っていない(私はそれがあなたが "Reshaper"の意味であったと仮定します) – user316117

5

グローバルCompositionTarget.Renderingイベントを使用するフレームごとのレンダリングを使用します。すべての加入者に対して、フレームごとに1回呼び出されます。あなたはそれについての詳細をここで読むことができます:https://msdn.microsoft.com/en-us/library/ms748838%28v=vs.100%29.aspx

DXElementソースコードでは、Renderer依存関係プロパティが表示されます。このプロパティのプロパティが変更されたハンドラでは、条件が一致する(コントロールが表示され、デザインモードなどではない)場合、前述のCompositionTarget.Renderingイベントにどのように登録されているかがわかります。また、最初からどれくらいの時間が経過したかを測定するためにStopwatchを開始し、フレームをレンダリングします。

OnRenderハンドラについては言及しました。これは、いくつかの条件の下で(親コントロールが子供をレイアウトする方法を決定するとき)レイアウト・パス中に呼び出されます。これは、DXElementが最初にレンダリングされるときに一度呼び出され、次にDXElementのサイズ変更などのときに呼び出されます。またはInvalidateVisualを呼び出します。しかし、ではありませんあなたの例でこれらの三角形が色を変えるときに呼び出されます - これはCompositionTarget.Renderingイベントを使って行われます。

あなたの質問に対する簡単な答えは、あなたの例で使用されるすべてのイベントが、WPFレンダリングシステムによってトリガーされることです。

関連する問題