【问题标题】:Force rendering of a WPF control in memory强制在内存中呈现 WPF 控件
【发布时间】:2009-07-03 18:15:48
【问题描述】:

我有以下代码:

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

此代码应该将 currentImage(我的 xaml 中的 Image 控件)渲染到 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。

有什么方法可以在不使用此解决方法的情况下使其正常工作?可能强制 Image 控件在内存中呈现?

谢谢!

【问题讨论】:

  • 注意:如果您有一个复杂的布局并且您使用转换器显示和隐藏元素,您最终可能会得到一个不正确的最终布局。这是我必须解决的问题:stackoverflow.com/questions/41966704/…

标签: wpf wpf-controls


【解决方案1】:

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

【讨论】:

  • 非常感谢您提供此解决方案!我已经为此苦苦挣扎了一段时间,但不知道在内存中渲染的 ViewBox 技巧。谢谢!!
  • 可以使用其他“容器”(从 Panel 派生的任何东西)来实现相同的结果。 ViewBox 会缩放内容,而 Panels 不会。
【解决方案2】:

我认为这是 BETTER answer
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 没有明确指定高度或宽度。但是,强制渲染将考虑提供的标题文本和图标来渲染它。

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2012-01-05
    • 2011-06-12
    • 2010-10-23
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多