Генерация растрового изображения WPF UIElement в ASP.NET - PullRequest
2 голосов
/ 01 августа 2010

Я пытаюсь сгенерировать растровое изображение на границе WPF.Все это находится в приложении asp.net (конечно, на стороне сервера) под управлением .net 4.0.

Проблема в том, что сгенерированный образ, ну, в общем, пустой.У кого-нибудь есть идея, почему?

Вот код.

public static byte[] Draw(int width, int height)
    {
        MemoryStream memoryStream
            = new MemoryStream();
        Thread t = new Thread(delegate()
            {
                System.Windows.Controls.Border border = new System.Windows.Controls.Border()
                {
                    Background = Brushes.Red,
                    BorderBrush = Brushes.Green,
                    CornerRadius = new System.Windows.CornerRadius(5),
                    Width = width,
                    Height = height
                };

                border.ApplyTemplate();

                RenderTargetBitmap renderTargetBitmap = 
                    new RenderTargetBitmap(width, height, 90, 90, PixelFormats.Pbgra32);

                renderTargetBitmap.Render(border);

                BitmapEncoder bitmapEncoder = 
                    new PngBitmapEncoder();

                bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
                bitmapEncoder.Save(memoryStream);
            });
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        bool success = t.Join(5000);

        if (success)
            return memoryStream.ToArray();
        else
            throw new Exception("Fail");
    }

Результат довольно плохой, как я уже говорил, вещь возвращает изображение с правильной шириной и высотой, но оно пустоетак что, думаю, я ничего не испорчу с битом потоков.

1 Ответ

4 голосов
/ 01 августа 2010

Добавить сразу после border.ApplyTemplate:

border.Measure(new Size(width, height));
border.Arrange(new Rect(0, 0, width, height));
border.UpdateLayout();

Ваша граница не обновилась до того, как вы ее сохранили.

...