我有以下代码:
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控件在内存中渲染可能吗?
谢谢!
答案 0 :(得分:41)
使用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);
答案 1 :(得分:10)
我认为这是BETTER answer。
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
未被赋予明确的高度或宽度。但是,强制渲染将使其考虑提供的标题文本和图标。