Я хотел бы захватить обычный рендеринг WPF, чтобы разделить элементы управления на примитивы, сделать управление макетами, применить привязки и т. Д. Для меня.Рендеринг в пользовательский DrawingContext
Насколько я понимаю, весь рендеринг в 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, или мне нужно искать другую точку перехвата?
Из примечаний к DrawingContext: 'Вы никогда не создаете экземпляр DrawingContext; вы можете, однако, получить контекст рисования из определенных методов, таких как DrawingGroup.Open и DrawingVisual.RenderOpen.' Для меня это означает, что нет способа действительно * снабжать * пользовательским DrawingContext где-то. – Clemens
@ Clemens: да, я видел это замечание, но я понял это как «вы не должны создавать его сами, мы делаем это для вас внутренне, а для рисования в DrawingVisual просто позвольте DrawingVisual правильно инициализировать его». Во всяком случае, интересно, есть ли допустимые точки перехвата для рисования. – Vlad
Единственный способ рисовать в DrawingVisual - это рисовать в DrawingContext, предоставляемый DrawingVisual.RenderOpen. Нет простого способа связать свой собственный DrawingContext с Visual. Идея бессмысленна. – Clemens