我正在尝试通过使用示例程序 (http://sharpdxwpf.codeplex.com/SourceControl/latest#SharpDX.WPF.sln) 来学习 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 的声明和构造函数看起来像这样 . . .
public class DXElement : FrameworkElement, INotifyPropertyChanged
public DXElement()
{
base.SnapsToDevicePixels = true;
m_renderTimer = new Stopwatch();
m_surface = new DXImageSource();
m_surface.IsFrontBufferAvailableChanged += delegate
{
UpdateReallyLoopRendering();
if (!m_isReallyLoopRendering && m_surface.IsFrontBufferAvailable)
Render();
};
IsVisibleChanged += delegate { UpdateReallyLoopRendering(); };
}
DXElement 的其余部分只是简短的事件处理程序。这是一个示例:
protected override void OnRender(DrawingContext dc)
{
dc.DrawImage(Surface, new Rect(RenderSize));
}
注意“覆盖”。我假设 DXElement 的父类之一(FrameworkElement 或 INotifyPropertyChanged)已经在监听这些事件。但是是什么触发这些事件呢? (例如,OnRender()、OnLoopRendering() 等)它们似乎是运行程序的引擎。如何跟踪导致此类事件在 WPF 程序中触发的原因? 如果我在它们处设置断点,我会看到它们被击中,但它们是从 framwework 调用的,例如,
SharpDX.WPF.dll!SharpDX.WPF.DXElement.OnRender(System.Windows.Media.DrawingContext dc) Line 153 C# PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect) Unknown PresentationFramework.dll!System.Windows.Controls.Grid.ArrangeOverride(System.Windows.Size arrangeSize) Unknown PresentationFramework.dll!System.Windows.FrameworkElement.ArrangeCore(System.Windows.Rect finalRect) Unknown PresentationCore.dll!System.Windows.UIElement.Arrange(System.Windows.Rect finalRect) Unknown PresentationFramework.dll!MS.Internal.Helper.ArrangeElementWithSingleChild(System.Windows.UIElement element, System.Windows.Size arrangeSize) Unknown PresentationFramework.dll!System.Windows.Controls.ContentPresenter.ArrangeOverride(System.Windows.Size arrangeSize) Unknown
...所以我不明白程序是如何让这些事件发生的。我该如何解决?
最佳答案
他们使用全局 CompositionTarget.Rendering
事件进行逐帧渲染。对于所有订阅者,每帧调用一次。您可以在此处阅读更多详细信息:https://msdn.microsoft.com/en-us/library/ms748838%28v=vs.100%29.aspx .
在 DXElement 源代码中,您会看到渲染器依赖属性。在此属性的属性更改处理程序中,如果某些条件匹配(控件可见,不在设计模式等),您将看到它们如何订阅提到的 CompositionTarget.Rendering
事件。他们还启动 Stopwatch
来测量自开始以来经过了多少时间,然后渲染帧。
至于您提到的 OnRender 处理程序。在某些情况下,这一个在布局过程中调用(当父控件决定如何布置它们的子控件时)。它在首次呈现 DXElement 时被调用一次,然后在您调整 DXElement 大小时或对其调用 InvalidateVisual
时被调用。但在您的示例中,当这些三角形改变颜色时,不会调用它 - 这是使用 CompositionTarget.Rendering
事件完成的。
对您的问题的简短回答是 - 您示例中使用的所有事件均由 WPF 渲染系统触发。
关于c# - 需要了解这个WPF程序中的事件触发。 .,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36651696/