c# - 需要了解这个WPF程序中的事件触发。 .

标签 c# .net wpf

我正在尝试通过使用示例程序 (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/

相关文章:

javascript - AJAX Web 开发的最佳技术

c# - 在 Windows Phone 中从 Web 下载一些图像时出现网络错误

C# Mono Linux 进程输出

c# - 如何通过复选框启用和禁用 DataGridView 中的特定行?

.net - 是否可以在 serilog 中更改颜色?

c# - 框架 View 模型

c# - WPF Prism Bound 字段值在命令触发之前不可用

.net - Server.MapPath()

c# - (args 之间的区别是 { Length : > 0}) and args. Length?

wpf - 使 WPF slider 的工具提示在拖动时停留在屏幕上