0

我对一个FrameworkElement命名的 _frameworkElement 有一个参考,我需要FrameworkElement在活动中在 drawingContext 上绘制一个OnRender

像这样:

protected override void OnRender(DrawingContext drawingContext)
{
   drawingContext. ??
   base.OnRender(drawingContext);
}

我需要考虑应用于 _frameworkElement 的任何渲染转换

这个问题有什么干净的解决方案吗?谢谢

编辑

为什么我需要重写 OnRender:

由于我有一个图形应用程序,用户可以绘制形状,并使用可以绘制矩形选择区域的选择工具选择多个形状。

我所做的是将舞台画布中的选定形状重新设置为用户可以移动和调整大小的选择画布,在选择画布上进行转换后,用户将单击舞台画布,然后我将形状重新设置为舞台画布。

问题:

将子元素从 Canvas 移除到 Canvas 时存在瓶颈,Children.Remove & Children.Add 将花费时间来实现,特别是当用户选择大量形状进行变换时。

所以 ?

我想不要重新选择选定的形状,而是通过覆盖 OnRender 在选择 Canvas 的 drawingContext 上绘制它们

4

2 回答 2

0

不,我不相信你能做到这一点,也没有真正的意义。每个元素DrawingContext都是独一无二UIElement的,框架处理在枚举时调用适当的绘图方法(例如,每个元素都有自己的 OnRender 通道)。

我并不完全遵循您的设计+问题,但也许这些会有所帮助?

WPF画布性能-children.add多次调用

如何在0.5秒内用WPF画出万点的线?

如果您需要深入了解 WPF 的呈现方式,是一本不错的读物。

于 2014-07-18T15:57:30.457 回答
0

调用代码:

private FrameworkElement _frameworkElement = null;

protected override void OnRender(DrawingContext dc)
{
    var rect = new Rect(new Point(0, 0), new Size(Width, Height));

    dc.DrawImage(UtilityWPF.RenderControl(_frameworkElement, Width.ToInt_Round(), Height.ToInt_Round(), false), rect);
}

辅助方法:

public const double DPI = 96;

/// <summary>
/// This tells a visual to render itself to a wpf bitmap
/// </summary>
/// <remarks>
/// This fixes an issue where the rendered image is blank:
/// http://blogs.msdn.com/b/jaimer/archive/2009/07/03/rendertargetbitmap-tips.aspx
/// </remarks>
public static BitmapSource RenderControl(FrameworkElement visual, int width, int height, bool isInVisualTree)
{
    if (!isInVisualTree)
    {
        // If the visual isn't part of the visual tree, then it needs to be forced to finish its layout
        visual.Width = width;
        visual.Height = height;
        visual.Measure(new Size(width, height));        //  I thought these two statements would be expensive, but profiling shows it's mostly all on Render
        visual.Arrange(new Rect(0, 0, width, height));
    }

    RenderTargetBitmap retVal = new RenderTargetBitmap(width, height, DPI, DPI, PixelFormats.Pbgra32);

    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext ctx = dv.RenderOpen())
    {
        VisualBrush vb = new VisualBrush(visual);
        ctx.DrawRectangle(vb, null, new Rect(new Point(0, 0), new Point(width, height)));
    }

    retVal.Render(dv);      //  profiling shows this is the biggest hit

    return retVal;
}
于 2019-12-01T04:36:20.433 回答