我正在尝试使用示例程序(http://sharpdxwpf.codeplex.com/SourceControl/latest#SharpDX.WPF.sln)学习SharpDX ...它使用4种不同的方法创建了4个阴影三角形的象限只是自己重绘图形.它连续运行并且似乎是事件驱动的,因为我不断地在事件处理程序中查找断点(见下文),但我不明白是什么触发了这些事件.在它的XAML中...
xmlns:dxc="clr-namespace:SharpDX.WPF;assembly=SharpDX.WPF"
Run Code Online (Sandbox Code Playgroud)
...
<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"/>
Run Code Online (Sandbox Code Playgroud)
...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(); };
}
Run Code Online (Sandbox Code Playgroud)
DXElement的其余部分只是简短的事件处理程序.这是一个例子:
protected override void OnRender(DrawingContext dc)
{
dc.DrawImage(Surface, new Rect(RenderSize));
}
Run Code Online (Sandbox Code Playgroud)
注意"覆盖".我假设其中一个DXElement(FrameworkElement或INotifyPropertyChanged)的父类已经在侦听这些事件.但是什么引发了这些事件?(例如,OnRender(),OnLoopRendering()等)它们似乎是运行程序的引擎.如何在WPF程序中跟踪导致此类事件的原因?如果我在他们设置一个断点,我看到他们被击中,但他们是从framwework调用的,例如,
SharpDX.WPF.dll!SharpDX.WPF.DXElement.OnRender(System.Windows.Media.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)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)未知
...所以我不明白该计划正在做些什么来使这些事件发生.我怎么知道这个?
它们使用全局CompositionTarget.Rendering事件使用每帧渲染.对于所有订阅者,每帧调用一次.您可以在此处阅读有关它的更多详细信息: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渲染系统触发的.
| 归档时间: |
|
| 查看次数: |
347 次 |
| 最近记录: |