Я пытаюсь изучить 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) Неизвестный
... так что я не понимаю, что программа делает для того чтобы сделать эти события происходят. Как мне это понять?
Я нашел поиск в файле во всем решении для «InvalidateVisual» и получил 0 обращений. Поэтому, если это не вызвано из чего-то еще в рамках, которое косвенно вызвано из программы, то это, похоже, не так. Вот почему я ищу способ отслеживать события в программе WPF, чтобы увидеть, что их увольняет. Как мне это сделать? – user316117
Вы можете использовать https://snoopwpf.codeplex.com/, но он не будет возвращать такие события низкого уровня, возможно, XAMLSpy (untested). Или, если у вас есть Reshaper, вы можете найти способы использования этого метода с помощью клавиши Shift + F12. – Aybe
Я пробовал XAMLSpy, но я не мог найти его, чтобы найти свою программу. У меня нет Resharper (я полагаю, это то, что вы имели в виду под «Reshaper») – user316117