「Visual to RenderTargetBitmap」の質問に新たなひねりを加えました!
デザイナー向けに WPF のプレビューをレンダリングしています。つまり、WPF ビジュアルを取得して、そのビジュアルを表示せずにビットマップにレンダリングする必要があります。ここでそれを見るのと同じように、それを行うための素敵な小さな方法を手に入れました
private static BitmapSource CreateBitmapSource(FrameworkElement visual)
{
Border b = new Border { Width = visual.Width, Height = visual.Height };
b.BorderBrush = Brushes.Black;
b.BorderThickness = new Thickness(1);
b.Background = Brushes.White;
b.Child = visual;
b.Measure(new Size(b.Width, b.Height));
b.Arrange(new Rect(b.DesiredSize));
RenderTargetBitmap rtb = new RenderTargetBitmap(
(int)b.ActualWidth,
(int)b.ActualHeight,
96,
96,
PixelFormats.Pbgra32);
// intermediate step here to ensure any VisualBrushes are rendered properly
DrawingVisual dv = new DrawingVisual();
using (var dc = dv.RenderOpen())
{
var vb = new VisualBrush(b);
dc.DrawRectangle(vb, null, new Rect(new Point(), b.DesiredSize));
}
rtb.Render(dv);
return rtb;
}
私のFrameworkElementにVisualBrushがある場合、そのブラシは最終的にレンダリングされたビットマップにはなりません。このようなもの:
<UserControl.Resources>
<VisualBrush
x:Key="LOLgo">
<VisualBrush.Visual>
<!-- blah blah -->
<Grid
Background="{StaticResource LOLgo}">
<!-- yadda yadda -->
それ以外はすべてビットマップにレンダリングされますが、その VisualBrush は表示されません。明らかな Google ソリューションが試みられ、失敗しました。RTB されたビットマップにない VisualBrushes について具体的に言及しているものでさえ。
これはリソースであり、遅延リソースがインライン化されていないことが原因である可能性があるという卑劣な疑いがあります。したがって、可能な修正は、何らかの方法で (???)、レンダリングの前にすべての静的リソース参照の解決を強制することです。しかし、私はそれを行う方法がまったくわかりません。
誰でもこれを修正できますか?