2016-04-15 1 views
8

Я пытаюсь изучить SharpDX с помощью примера программы (http://sharpdxwpf.codeplex.com/SourceControl/latest#SharpDX.WPF.sln) ... он создает квадрант из четырех затененных треугольников, используя 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 выглядит так: . , ,

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 постоянного тока) Line 153 C# PresentationCore.dll! System.Windows.UIElement.Arrange (System.Windows.Rect finalRect) Неизвестный PresentationFramework.dll! System.Windows.Controls.Grid.ArrangeOverride (System.Windows.Size organizSize) Неизвестно 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. длл! System.Windows.Controls.ContentPresenter.ArrangeOverride (System.Windows.Size arrangeSize) Неизвестный

... так что я не понимаю, что программа делает для того чтобы сделать эти события происходят. Как мне это понять?

ответ

1

Грубое предположение состоит в том, что он вызывает InvalidateVisual() с помощью периодического таймера, который в какой-то момент будет вызывать OnRender().

+0

Я нашел поиск в файле во всем решении для «InvalidateVisual» и получил 0 обращений. Поэтому, если это не вызвано из чего-то еще в рамках, которое косвенно вызвано из программы, то это, похоже, не так. Вот почему я ищу способ отслеживать события в программе WPF, чтобы увидеть, что их увольняет. Как мне это сделать? – user316117

+0

Вы можете использовать https://snoopwpf.codeplex.com/, но он не будет возвращать такие события низкого уровня, возможно, XAMLSpy (untested). Или, если у вас есть Reshaper, вы можете найти способы использования этого метода с помощью клавиши Shift + F12. – Aybe

+0

Я пробовал XAMLSpy, но я не мог найти его, чтобы найти свою программу. У меня нет Resharper (я полагаю, это то, что вы имели в виду под «Reshaper») – user316117

5

Они используют рендеринг для каждого кадра с использованием глобального события CompositionTarget.Rendering. Он вызывается один раз для каждого кадра, для всех подписчиков. Подробнее об этом можно узнать здесь: https://msdn.microsoft.com/en-us/library/ms748838%28v=vs.100%29.aspx.

В исходном коде DXElement вы видите свойство зависимостей Renderer.В обработчике свойств, измененном для этого свойства, вы увидите, как они подписываются на упомянутое событие CompositionTarget.Rendering, если некоторые условия совпадают (управление видимо, а не в режиме разработки и т. Д.). Они также начинают Stopwatch, чтобы измерить, сколько времени прошло с самого начала, а затем визуализировать кадр.

Что касается OnRender handler вы упомянули. Этот вызов вызывается во время макета (когда родительские элементы управления решают, как выложить своих детей) при некоторых условиях. Он вызывается один раз, когда DXElement сначала отображается, затем вызывается, когда вы, например, изменяете размер DXElement или вызываете InvalidateVisual. Но это не называется, когда эти треугольники меняют цвет в вашем примере - это делается с помощью события CompositionTarget.Rendering.

Так короткий ответ на ваш вопрос будет: все события, используемые в вашем примере, запускаются системой рендеринга WPF.

Смежные вопросы