Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要了解此WPF程序中的事件触发。_C#_.net_Wpf - Fatal编程技术网

C# 需要了解此WPF程序中的事件触发。

C# 需要了解此WPF程序中的事件触发。,c#,.net,wpf,C#,.net,Wpf,我试图通过使用示例程序()来学习SharpDX。。。它使用4种不同的方法创建了一个由4个着色三角形组成的象限,它只需自行重新绘制图形即可。它持续运行,似乎是事件驱动的,因为我不断地在事件处理程序中点击断点(见下文),但我不知道是什么触发了这些事件。 在XAML中它有 xmlns:dxc="clr-namespace:SharpDX.WPF;assembly=SharpDX.WPF" <dxc:DXElement Grid.Column="0" Grid.Row="0" x:Name

我试图通过使用示例程序()来学习SharpDX。。。它使用4种不同的方法创建了一个由4个着色三角形组成的象限,它只需自行重新绘制图形即可。它持续运行,似乎是事件驱动的,因为我不断地在事件处理程序中点击断点(见下文),但我不知道是什么触发了这些事件。 在XAML中它有

  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的其余部分只是简短的事件处理程序。这里有一个例子:

protected override void OnRender(DrawingContext dc)
{
    dc.DrawImage(Surface, new Rect(RenderSize));
}
注意“覆盖”。我假设DXElement的父类之一(FrameworkElement或INotifyPropertyChanged)已经在侦听这些事件。但是是什么触发了这些事件呢?(例如OnRender()、OnLoopRendering()等)它们似乎是运行程序的引擎。如何跟踪WPF程序中引发此类事件的原因? 如果我在他们身上设置一个断点,我会看到他们被击中,但他们是从FramWork调用的,例如

SharpDX.WPF.dll!SharpDX.WPF.DXElement.OnRender(System.Windows.Media.DrawingContext dc)第153 C行# PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect 最终结果)未知 PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size 排列大小)未知 PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect 最终结果)未知 PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect 最终结果)未知 PresentationFramework.dll!MS.Internal.Helper.ArrangeElement与SingleChild(System.Windows.UIElement 元素,System.Windows.Size arrangeSize)未知 PresentationFramework.dll!System.Windows.Controls.ContentPresenter.ArrangeOverride(System.Windows.Size 排列大小)未知


。。。所以我不明白这个项目是怎么让这些事件发生的。我怎么知道呢?

粗略猜测,它是从一个循环计时器中调用的,该计时器在某个时候会调用。

他们使用全局
CompositionTarget.rendering
事件进行每帧渲染。对于所有订阅者,每帧调用一次。您可以在此处阅读有关它的更多详细信息:

在DXElement源代码中,可以看到渲染器依赖项属性。在该属性的属性更改处理程序中,您将看到如果某些条件匹配(控件可见,而不是在设计模式下,等等),它们是如何订阅所提到的
CompositionTarget.Rendering
事件的。它们还启动秒表来测量从开始到现在经过了多少时间,然后渲染帧

至于您提到的OnRender处理程序。在某些条件下,在布局过程中(当父控件决定如何布局其子控件时)调用此函数。第一次渲染DXElement时会调用一次,然后在调整DXElement的大小或对其调用
InvalidateVisual
时会调用它。但在您的示例中,当这些三角形改变颜色时,不会调用它-这是使用
CompositionTarget.Rendering
事件完成的


因此,对您的问题的简短回答是-您的示例中使用的所有事件都是由WPF渲染系统触发的。

我在整个解决方案中搜索了“InvalidateVisual”,得到了0个点击率。因此,除非它是从框架中的其他东西调用的,而这些东西是从程序间接调用的,否则它似乎不是。这就是为什么我在寻找某种方法来跟踪WPF程序中的事件,看看是什么触发了它们。我该怎么做?您可以使用,但它不会返回这样的低级事件,可能是XAMLSpy(未测试)。或者,如果你有整形器,你可以通过Shift+F12键找到该方法的用法。我尝试了XAMLSpy,但我无法让它找到我的程序。我没有Resharper(我想这就是你所说的“重塑者”)
protected override void OnRender(DrawingContext dc)
{
    dc.DrawImage(Surface, new Rect(RenderSize));
}