好吧,这对 WPFish 基础非常深入,但请参阅:
简短:如何实现我自己的 RenderThread。
我正在解决一个问题,我需要在 WPF 应用程序中显示 10 位。由于这个和其他原因,它必须是 OpenGL(它能够很好地处理 10 位)。绑定(bind)和 WPF 控件是众所周知的,它们的功能深受我们喜爱。所以对于少数控件,我希望使用它们,甚至可能在我的 OpenGL 上下文中绘制它们。
有趣的是,我使用自己的 PresentationSource
将 WPF 的某些部分作为独立的对象树工作。布局有效,但事件目前确实由于缺少部分(焦点)而失败。可能事件永远不会起作用,因为它不可能从某些内部类派生,例如 CompositionTarget
... :-/
但是:
所以我可以在我的 OpenGL 上下文中进行我自己的绘图(只是一对按钮和边框)但是我无法忘记检查 WPF Visual-Tree 的想法,捕获所有的 DrawingGroups
并在 OpenGL 中重做绘画。
我得到的是一棵 DrawingGroups
、EllipseGeometry
和 RectangleGeometry
树 - 如此可绘制的基元。
DrawingGroup drawing = VisualTreeHelper.GetDrawing((Visual) firstChild);
这个想法的问题是:我如何确定/我的可视化树是否已经改变。我的意思不是全部,而是那里的依赖属性。说明:有一个 WPF 覆盖 protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved)
但据我观察,它调用的频率不够。我想观察的是:当动画发生时,它会为例如宽度或不透明度或作为视觉树一部分的画笔设置动画。然后,我需要重新绘制我的 OpenGL 上下文。 WPF 如何确定以及我如何观察?
最佳答案
我认为LayoutUpdated应该给你你需要的。
考虑这个代码示例: XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="525" Loaded="MainWindow_OnLoaded">
<StackPanel>
<Canvas x:Name="TargetCanvas" Height="300">
<Rectangle x:Name="Subject" Canvas.Top="50" Canvas.Left="50" Fill="Maroon" Height="25" Width="25"/>
</Canvas>
<Button Content="Move">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard Target="{Binding ElementName=Subject}" TargetProperty="(Canvas.Left)" AutoReverse="True">
<DoubleAnimation To="200" Duration="00:00:02"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
</StackPanel>
</Window>
和代码背后:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
{
TargetCanvas.LayoutUpdated += TargetCanvas_LayoutUpdated;
}
void TargetCanvas_LayoutUpdated(object sender, EventArgs e)
{
Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + ": Layout updated\n");
}
}
关于c# - WPF 如何确定应该重绘某些内容?我怎么知道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30301587/