Erstellen WPF Element außerhalb des Bildschirms und rendern, um Bitmap
-
18-09-2019 - |
Frage
Ich kann nicht verstehen, warum dies nicht funktioniert, oder das, was ich brauche, um es Arbeit zu lernen.
Um repro, eine einfache WPF-Anwendung erstellen und das Hauptfenster des Konstruktor ersetzen so:
public MainWindow()
{
InitializeComponent();
// simple visual definition
var grid = new Grid { Width = 300, Height = 300 };
var text = new TextBlock
{
Text = "Y DON'T I WORK???",
FontSize = 100,
FontWeight =
FontWeights.Bold
};
grid.Children.Add(text);
// update the layout so everything is awesome cool
grid.Measure(grid.DesiredSize);
grid.Arrange(new Rect(grid.DesiredSize));
grid.UpdateLayout();
// create a BitmapSource from the visual
var rtb = new RenderTargetBitmap(
(int)grid.Width,
(int)grid.Height,
96,
96,
PixelFormats.Pbgra32);
rtb.Render(grid);
// Slap it in the window
this.Content = new Image { Source = rtb, Width = 300, Height = 300 };
}
Dies führt zu einem leeren Bild. Wenn ich die RTB auf der Festplatte als PNG seine die richtige Größe speichern, aber transparent sein.
Wenn ich aber tun dies mit einem visuellen, die auf dem Bildschirm angezeigt worden ist, es funktioniert gut.
Wie kann ich machen eine visuelle ich außerhalb des Bildschirms in eine Bitmap konstruiert haben?
Lösung
Weil Elemente haben keine gewünschte Größe, bis Sie sie messen. Sie sagten, das Netz Größe selbst mit einem verfügbaren Raum von 0x0. Ändern Sie den Code an:
grid.Measure(new Size(grid.Width, grid.Height));
grid.Arrange(new Rect(new Size(grid.Width, grid.Height)));
(Der Aufruf von UpdateLayout ist nicht benötigt.)