/ / Renderuj WPF UIElement bez użycia arrange () - wpf, bitmap, rendertargetbitmap

Renderowanie UFU WPF bez użycia aranżacji () - wpf, bitmapy, rendertargetbitmap

Próbuję wyrenderować płótno z mojego ViewModel. Po przekazaniu płótna na moją maszynę wirtualną renderuję go za pomocą tej funkcji:

private void GenerateTextures(object obj)
{
if (!(obj is UIElement))
return;

UIElement control = (UIElement)obj;

for (int i = 0; i <= _textureCount - 1; ++i)
{
string path = OutPath + i.ToString() + TextureFormat;
FontText = i.ToString();

using (FileStream fs = new FileStream(path,FileMode.Create))
{
control.Measure(new Size(_textureSize, _textureSize));
//control.Measure(size);
control.Arrange(new Rect(new Size(_textureSize, _textureSize)));
control.UpdateLayout();

RenderTargetBitmap bitmap = new RenderTargetBitmap(_textureSize, _textureSize, 96, 96, PixelFormats.Pbgra32);
bitmap.Render(control);
BitmapEncoder encoder;
switch (TextureFormat)
{
case ".png":
encoder = new PngBitmapEncoder();
break;
case ".jpg":
encoder = new JpegBitmapEncoder();
break;
case ".gif":
encoder = new GifBitmapEncoder();
break;
default:
encoder = new PngBitmapEncoder();
break;
}

encoder.Frames.Add(BitmapFrame.Create(bitmap));
encoder.Save(fs);
}
}
}

Działa to dobrze i wszystko oprócz arrange ()funkcja powoduje, że moje płótno przesuwa się w lewy górny róg jego rodzica, co wizualnie psuje mój interfejs użytkownika. Jeśli usunę wywołanie arrange (), wówczas moja renderowana mapa bitowa jest tylko małym rogiem cavas.

Jak mogę renderować moje cavy bez przenoszenia ich w interfejsie użytkownika?

Odpowiedzi:

0 dla odpowiedzi № 1

Myślę, że powinieneś określić lokalizację Płótna podczas jego aranżacji. Możesz użyć tego konstruktora Rect:

publiczny Rect (lokalizacja punktu, rozmiar rozmiaru);

Twój kod może być taki:

control.Arrange(new Rect(new Point(X,Y), new Size(_textureSize, _textureSize)));

Ponadto należy wywołać miarę i ustawić kod po zmianie lub aktualizacji układu rodzica.