Можете ли вы визуализировать объект StreamGeometry в нескольких местах во время переопределения OnRender?

У нас есть объект StreamGeometry, который мы хотим визуализировать примерно в 400 разных местах во время вызова OnRender. Проблема, конечно, в том, что геометрический объект использует абсолютные координаты.

Хотя мы могли бы, конечно, применить преобразования перед вызовом рендеринга, это означает, что мы, по сути, создали бы также 400 преобразований, что выглядит как избыточное убийство.

Мы просто хотим сказать: "Визуализируйте это в этом месте, например так (Примечание: DrawGeometryAtPoint вымышлен)...

protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
    base.OnRender(dc);

    var myGeometry = new StreamGeometry();

    // Code to init the geometry goes here

   // Render the same geometry but at four different locations
    dc.DrawGeometryAtPoint(Brush1, Pen1, myGeometry, Origin1);
    dc.DrawGeometryAtPoint(Brush2, Pen2, myGeometry, Origin2);
    dc.DrawGeometryAtPoint(Brush3, Pen3, myGeometry, Origin3);
    dc.DrawGeometryAtPoint(Brush4, Pen4, myGeometry, Origin4);
}

Так можно ли это сделать?

1 ответ

По сути, это тот же вопрос, что и ваш предыдущий.

Либо вы нажимаете отдельное преобразование перед каждым рендерингом.

var transform = new TranslateTransform(origin.X, origin.Y);
transform.Freeze();
dc.PushTransform();
dc.DrawGeometry(brush, pen, geometry;
dc.Pop();

По сути, это то же самое, что поместить GeometryDrawing в DrawingGroup и установить свойство DrawingGroup.Transform.

Или вы помещаете StreamGeometry в GeometryGroup и устанавливаете там Transform.

var transform = new TranslateTransform(origin.X, origin.Y);
transform.Freeze();
var group = new GeometryGroup { Transform = transform };
group.Children.Add(geometry);
dc.DrawGeometry(brush, pen, group;

Как я уже говорил в своем комментарии к другому вопросу, невозможно обойтись, если использовать отдельный объект Transform для каждого рендеринга одной и той же геометрии в разных местах.


РЕДАКТИРОВАТЬ: Вы должны рассмотреть другой дизайн. Вместо выполнения полного прохода OnRender каждый раз, когда ваши объекты немного двигаются, вы должны выполнять рендеринг один раз, а затем изменять только объекты Tranform. Который тогда, конечно, не должен быть заморожен. Поэтому вы не будете переопределять OnRender в каком-либо элементе управления, но предоставите специальный элемент управления, в котором размещается DrawingVisual.

Другие вопросы по тегам