在内存中强制呈现WPF控件

在内存中强制呈现WPF控件,wpf,wpf-controls,Wpf,Wpf Controls,我有以下代码: void Test() { currentImage.Source = GetBitmap(); RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96.0, 96.0, PixelFormats.Default); rtb.Render(currentImage); } 这段代码应该将currentImage(我的xaml中的一个图像控件)渲染为RenderTargetBitmap 它不

我有以下代码:

void Test()
{
    currentImage.Source = GetBitmap();
    RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96.0, 96.0, PixelFormats.Default);
    rtb.Render(currentImage);
}
这段代码应该将currentImage(我的xaml中的一个图像控件)渲染为RenderTargetBitmap

它不工作,rtb返回一个空白图像,问题是currentImage还没有呈现自己,所以这种行为是预期的,我认为

为了解决这个问题,我编写了以下代码:

void Test()
{
    currentImage.Source = GetBitmap();

    this.Dispatcher.BeginInvoke((Action)delegate()
    {
        RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96.0, 96.0, PixelFormats.Default);
        rtb.Render(currentImage);
    }, System.Windows.Threading.DispatcherPriority.Render, null);

}
基本上,我会等待currentImage被渲染,然后我可以将它正确地渲染到我的RenderTargetBitmap

有没有办法不使用这个变通方法就可以让它工作?强制图像控件在内存中渲染可能吗


谢谢

使用ViewBox在内存中渲染

Grid grid = new System.Windows.Controls.Grid() { Background = Brushes.Blue, Width = 200, Height = 200 };
Viewbox viewbox = new Viewbox();
viewbox.Child = grid; //control to render
viewbox.Measure(new System.Windows.Size(200, 200));
viewbox.Arrange(new Rect(0, 0, 200, 200));
viewbox.UpdateLayout();
RenderTargetBitmap render = new RenderTargetBitmap(200, 200, 150, 150, PixelFormats.Pbgra32);
render.Render(viewbox);
我想这是一个好主意
查看框没有完全按照预期工作,结果是不必要的开销

这是答案的副本(而不仅仅是链接)


您需要强制渲染该项,或等待渲染该项。然后可以使用
ActualHeight
ActualWidth
属性

要强制渲染,请执行以下操作:

  MenuItem item = new MenuItem();
  item.Header = "bling";
  item.Icon = someIcon;
  //Force render
  item.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
  item.Arrange(new Rect(item.DesiredSize));

在本例中,
MenuItem
没有给出明确的高度或宽度。但是,强制渲染将根据提供的标题文本和图标进行渲染。

非常感谢您提供此解决方案!我已经为此挣扎了一段时间,但不知道在内存中渲染ViewBox的技巧。非常感谢。可以使用其他“容器”(从面板派生的任何东西)来实现相同的结果。视图框将缩放内容,而面板将不缩放内容。注意:如果布局复杂,并且使用转换器显示和隐藏元素,则最终可能会出现不正确的最终布局。这就是我必须做的,来解决这个问题: