首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在FrameworkElement上绘制drawingContext?

如何在FrameworkElement上绘制drawingContext?
EN

Stack Overflow用户
提问于 2012-11-13 14:25:13
回答 2查看 2K关注 0票数 0

我有一个名为FrameworkElement _frameworkElement的参考,我需要在OnRender事件上在drawingContext上画一个FrameworkElement

如下所示:

代码语言:javascript
复制
protected override void OnRender(DrawingContext drawingContext)
{
   drawingContext. ??
   base.OnRender(drawingContext);
}

我需要的是考虑应用于_frameworkElement的任何呈现转换

这个问题有什么干净的解决办法吗?谢谢

编辑

为什么我需要覆盖OnRender:

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

我所做的是重新父母选择的形状从舞台画布到选择画布,用户可以移动和调整大小,在选择画布上的转换,用户将点击舞台画布,然后我重新父的形状到舞台画布。

问题是:

在将子对象从画布移到画布时存在瓶颈,Children.Remove和Children.Add的实现将花费时间,特别是当用户选择大量形状进行转换时。

所以呢?

我不想重新选择选定的形状,而是通过重写drawingContext在选择画布的OnRender上绘制它们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-18 15:57:30

不,我不相信你能做到,这也不太合理。DrawingContext对每个UIElement都是唯一的,框架在枚举它们时处理调用适当的绘图方法(例如,每个元素都有自己的OnRender传递)。

我没有完全遵循你的设计问题,但也许这些会有帮助吗?

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

如何在0.5秒内用WPF绘制万千点的线?

如果您需要深入研究WPF的呈现方式,是一个很好的读物。

票数 0
EN

Stack Overflow用户

发布于 2019-12-01 04:36:20

呼叫代码:

代码语言:javascript
复制
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);
}

辅助方法:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13362448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档