Конвертировать окно XAML в растровое изображение - PullRequest
0 голосов
/ 10 января 2019

У меня есть простой XAML, подобный этому:

<UserControl x:Class="blabla.MyView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Name="myUserControl">
 <Grid Name="myGrid" Background="White">
    <TextBlock Name="myTextBlock"/>
 </Grid>
</UserControl>

Теперь я хотел бы создать новый вид в фоновом режиме с помощью этого xaml. После этого я хотел бы изменить элементы управления (или, возможно, добавить некоторые элементы управления самостоятельно), сохранить его в растровом изображении и назначить его в буфер обмена (просто чтобы увидеть результат). Я бы попробовал это так:

MyView view = new MyView();
view.myTextBlock.Text = "TEST";

Rect bounds = VisualTreeHelper.GetDescendantBounds(view);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
{
    VisualBrush vb = new VisualBrush(view);
    ctx.DrawRectangle(vb, null, new Rect(new System.Windows.Point(), bounds.Size));
}
RenderTargetBitmap bmp = new RenderTargetBitmap((int)view.ActualWidth, (int)view.ActualHeight, 96, 96, PixelFormats.Pbgra32);

bmp.Render(dv);

PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(BitmapFrame.Create(bmp));
System.Windows.Clipboard.SetImage(pngImage.Frames[0]);

К сожалению, размер view не изменяется. Попытка установить жестко запрограммированную ширину / высоту создает черное изображение / растровое изображение.

Как мне создать простое растровое изображение из XAML?

1 Ответ

0 голосов
/ 10 января 2019

Оформление комментария к официальному ответу. Однако я вижу, что это решение не самое элегантное. Общее дело в том, что окно, соотв. view, приведет к появлению черной области при рендеринге, в то время как она сама не видна / не прорисована, если ее все равно отобразить.

Временным решением было бы показать это представление (как вы написали, но в Window). Небольшая идея сделать это, переместить окно из видимого экрана, чтобы избежать мерцания. Пример:

        var v = new MainWindow();
        v.Top = -10000; // far away
        v.Left = -10000; // far away
        v.Show();
        // .. do rendering
        v.Close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...