[英]How to draw FrameworkElement on drawingContext?
我有一个名为 _frameworkElement 的FrameworkElement
的参考,我需要在OnRender
事件中在drawingContext 上绘制一个FrameworkElement
。
像这样:
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext. ??
base.OnRender(drawingContext);
}
我需要的是考虑应用于 _frameworkElement 的任何渲染变换
这个问题有什么干净的解决方案吗? 谢谢
编辑
为什么我需要覆盖 OnRender:
由于我有一个图形应用程序,用户可以绘制形状,并使用可以绘制矩形选择区域的选择工具来选择多个形状。
我所做的是将舞台画布中的选定形状重新设置为用户可以移动和调整大小的选择画布,在选择画布上进行转换后,用户将单击舞台画布,然后我将形状重新设置为舞台画布。
问题:
从 Canvas 到 Canvas 移除子元素时存在瓶颈,Children.Remove & Children.Add 需要时间来实现,特别是当用户选择大量形状进行变换时。
所以 ?
我想不要重新设置选定形状的父级,而是通过覆盖 OnRender 在选择 Canvas 的drawingContext 上绘制它们
不,我不相信你能做到这一点,这也没有任何意义。 DrawingContext
对于每个UIElement
都是唯一的,并且框架会在枚举它们时处理调用适当的绘图方法(例如,每个元素都有自己的 OnRender 传递)。
我并没有完全遵循您的设计+问题,但也许这些会有所帮助?
如果您需要深入了解 WPF 的呈现方式,这是一本很好的读物。
调用代码:
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.