我有一个名为FrameworkElement _frameworkElement的参考,我需要在OnRender事件上在drawingContext上画一个FrameworkElement。
如下所示:
protected override void OnRender(DrawingContext drawingContext)
{
drawingContext. ??
base.OnRender(drawingContext);
}我需要的是考虑应用于_frameworkElement的任何呈现转换
这个问题有什么干净的解决办法吗?谢谢
编辑
为什么我需要覆盖OnRender:
由于我有一个图形应用程序,用户可以绘制形状,并使用选择工具选择多个形状,该工具将绘制矩形选择区域。
我所做的是重新父母选择的形状从舞台画布到选择画布,用户可以移动和调整大小,在选择画布上的转换,用户将点击舞台画布,然后我重新父的形状到舞台画布。
问题是:
在将子对象从画布移到画布时存在瓶颈,Children.Remove和Children.Add的实现将花费时间,特别是当用户选择大量形状进行转换时。
所以呢?
我不想重新选择选定的形状,而是通过重写drawingContext在选择画布的OnRender上绘制它们。
发布于 2014-07-18 15:57:30
不,我不相信你能做到,这也不太合理。DrawingContext对每个UIElement都是唯一的,框架在枚举它们时处理调用适当的绘图方法(例如,每个元素都有自己的OnRender传递)。
我没有完全遵循你的设计问题,但也许这些会有帮助吗?
如果您需要深入研究WPF的呈现方式,这是一个很好的读物。
发布于 2019-12-01 04:36:20
呼叫代码:
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;
}https://stackoverflow.com/questions/13362448
复制相似问题