在内存中的WPF控件的渲染力在内存中的WPF控件的渲染力(Force rendering of a

2019-05-16 16:09发布

我有以下代码:

void Test()
{
    currentImage.Source = GetBitmap();
    RenderTargetBitmap rtb = new RenderTargetBitmap(100, 100, 96.0, 96.0, PixelFormats.Default);
    rtb.Render(currentImage);
}

此代码应该呈现currentImage,这是我的XAML的RenderTargetBitmap Image控件。

它不工作,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。

有没有什么办法让它不使用此解决办法工作吗? 强制Image控件在内存来渲染可能?

谢谢!

Answer 1:

使用视框在内存来渲染

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);


Answer 2:

我认为这是一个更好的答案 。
viewbox没有如预期完全工作,它原来是不必要的开销。

这里是答案的拷贝(而不仅仅是链接)


您需要强制渲染的项目,或等待要呈现的项目。 然后,您可以使用ActualHeightActualWidth性能。

要强制渲染:

  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没有得到明确的高度或宽度。 然而,迫使渲染会使它走的是提供的头文本和图标考虑。



文章来源: Force rendering of a WPF control in memory