嗯,这涉及到WPF的基础知识:
简单来说,如何实现自己的RenderThread。
我正在解决一个问题,需要在WPF应用程序中使用10Bit显示。出于这个和其他原因,必须使用OpenGL(它非常适合进行10Bit操作)。绑定和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)
,但据我观察,它并没有被频繁调用。我想要观察的是:当动画发生时,例如对可视树中的Width、Opacity或Brushes进行动画处理时,我需要重新绘制我的OpenGL上下文。那么WPF是如何确定这一点的,我该如何观察到呢?