Я хотел бы захватить обычный рендеринг 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, или мне нужно искать другую точку перехвата?