我想劫持通常的WPF渲染,将控件分割为基元,对布局管理进行处理,应用绑定等。
据我所知,WPF中的整个渲染归结为在由依赖属性系统定义的值计算出的位置上呈现基元(文本、图像、线条、曲线)。如果我能提供自己的基元呈现逻辑,我就能够呈现到自定义文档类型,通过网络传输基元进行真正的呈现等。
我的计划如下:
1. 实现一个自定义
2. 创建一个WPF UserControl,并强制它呈现到给定的DrawingContext中。
然而,我遇到了以下问题:
— 但我想知道是否有一种直接的方法来呈现一个
那么,
据我所知,WPF中的整个渲染归结为在由依赖属性系统定义的值计算出的位置上呈现基元(文本、图像、线条、曲线)。如果我能提供自己的基元呈现逻辑,我就能够呈现到自定义文档类型,通过网络传输基元进行真正的呈现等。
我的计划如下:
1. 实现一个自定义
DrawingContext
。DrawingContext是一个抽象类,定义了一堆方法,如DrawEllipse、DrawText、DrawImage等——我需要为这些功能提供自己的实现。2. 创建一个WPF UserControl,并强制它呈现到给定的DrawingContext中。
然而,我遇到了以下问题:
DrawingContext
包含了抽象的内部方法void PushGuidelineY1(double coordinate)
和void PushGuidelineY2(double leadingCoordinate, double offsetToDrivenCoordinate)
,我不能轻易地覆盖它们。(也许有一些技巧可以克服这个问题?)- 似乎没有一种方法可以在
DrawingContext
上渲染整个可视化元素?为什么呢?
我可以做一些像这样的事情:
void RenderRecursively(UIElement e, DrawingContext ctx)
{
e.OnRender(ctx);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(e); i++)
RenderRecursively((UIElement)VisualTreeHelper.GetChild(e, i), ctx);
}
— 但我想知道是否有一种直接的方法来呈现一个
UIElement
。(当然,这个问题是一个小问题,但是看不到为它建立基础设施让我想知道这是否是正确的方式。)那么,
DrawingContext
不是用于继承的吗?提供自定义 DrawingContext
的整个想法是朝着正确的方向迈出的一步,还是我需要重新考虑策略?在 WPF 中支持在自定义上下文中绘制,还是我需要寻找不同的拦截点?