¡He encontrado un nuevo giro en la pregunta "Visual to RenderTargetBitmap"!RenderTargetBitmap + Resource'd VisualBrush = imagen incompleta
Estoy renderizando vistas previas de material de WPF para un diseñador. Eso significa que necesito tomar una imagen WPF y presentarla en un mapa de bits sin que se muestre esa imagen. ¿Tienes un método poco agradable de hacer que les gusta ver que aquí va
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;
}
funciona bien, excepto por una cosa ... si mi leeetle FrameworkElement tiene una VisualBrush, que el cepillo no terminar en la final mapa de bits renderizado Algo como esto:
<UserControl.Resources>
<VisualBrush
x:Key="LOLgo">
<VisualBrush.Visual>
<!-- blah blah -->
<Grid
Background="{StaticResource LOLgo}">
<!-- yadda yadda -->
Todo lo demás hace que el mapa de bits, pero que VisualBrush simplemente no se mostrará. Las soluciones obvias de Google se han intentado y han fallado. Incluso los que específicamente mencionan VisualBrushes falta de RTB'd bitmaps.
Tengo una sospecha furtiva de que esto podría ser causado por el hecho de que es un recurso, y ese recurso perezoso no está en línea. Entonces, una posible solución sería, de alguna manera (???), forzar la resolución de todas las referencias de recursos estáticos antes de renderizar. Pero no tengo absolutamente ninguna idea de cómo hacer eso.
¿Alguien tiene una solución para esto?
Bueno, lo leí e intenté enjuagar el despachador, pero eso no ayudó por sí solo. Intentaré agregar el origen de la presentación, lo que no hice. Gracias. – Will
Asegúrese de lavar el despachador en último lugar, después de todos los demás pasos.También noté que estableces la altura y el límite de forma explícita, mientras que yo medía con PositiveInfinity. –
@ray, sí, he estado haciendo eso por un tiempo y luego me di cuenta de que Measure solo necesita saber el máximo, en lugar del real. Lo he estado haciendo con + inf desde que lo aprendí. Intentaremos esto pronto – Will