我想劫持通常的 WPF 渲染来将控件拆分为基元,进行布局管理,为我应用绑定等。
据我了解,WPF 中的整个渲染归结为在布局管理器计算的位置处使用依赖属性系统定义的值渲染图元(文本、图像、线条、曲线)。如果我可以提供自己的原始渲染逻辑,我将能够渲染例如自定义文档类型,传输原始渲染以通过网络进行真实渲染等。
我的计划如下:
- 实现一个自定义
DrawingContext
. TheDrawingContext
是一个抽象类,它定义了一堆方法,如,DrawEllipse
等。我需要为这个功能提供我自己的实现。DrawText
DrawImage
- 创建一个 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 支持的自定义上下文上绘图,还是我需要寻找不同的拦截点?