Я хотел бы захватить обычный рендеринг WPF, чтобы разделить элементы управления на примитивы, сделать управление макетами, применить привязки и т.д. для меня.
Насколько я понимаю, весь рендеринг в WPF сводится к рендерингу примитивов (текст, изображение, линия, кривая) в местах, рассчитанных менеджером компоновки со значениями, определенными системой свойств зависимостей. Если бы я мог предоставить свою логику примитивного рендеринга, я бы смог отобразить, например. к типу пользовательского документа, переносите примитивы для реального рендеринга по сети и т.д.
Мой план выглядит следующим образом:
- Внедрение пользовательского
DrawingContext.DrawingContextявляется абстрактным классом, который определяет кучу таких методов, как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, или мне нужно искать другую точку перехвата?