簡體   English   中英

XAML文件到圖像,在后面綁定計算代碼

[英]XAML File to Image, Binding calculation code behind

我有以下代碼將XAML文件另存為Image-Stream,但未計算綁定。 有什么建議么?

// get byte-array from file
using (var xamlStream = new MemoryStream((byte[])value))
using (var stream = new MemoryStream())
{
    var thread = new Thread(() =>
    {
        // load xaml control from stream
        var control = (System.Windows.FrameworkElement)System.Windows.Markup.XamlReader.Load(xamlStream);

        if (control == null)
            return;

        control.DataContext =  new { Person = new { FIRSTNAME = "Test" } };
        control.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));

        // get size of control which would be needed by Window
        var controlSize = control.DesiredSize;
        var rect = new System.Windows.Rect(0, 0, controlSize.Width, controlSize.Height);

        // render XAML to bitmap
        var targetBitmap = new RenderTargetBitmap((int)controlSize.Width, (int)controlSize.Height, 120, 96, PixelFormats.Pbgra32);

        control.Arrange(rect);
        targetBitmap.Render(control);

        // convert to png and save to sream
        var png = new PngBitmapEncoder();
        png.Frames.Add(BitmapFrame.Create(targetBitmap));
        png.Save(stream);
    });
    thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
    thread.Start();
    thread.Join();
}

XAML代碼:

<Canvas  
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Name="_PrintCanvas" Width="1585" Height="1000">
  <TextBlock FontSize="80" Foreground="Red"  Text="{Binding Person.FIRSTNAME}" Canvas.Top="800" Canvas.Left="70" Margin="0,0,0,0"/>
</Canvas>

有沒有辦法在后面的代碼中顯式計算綁定?

所以我得到了解決方案: targetBitmap.Render(control);之前缺少一個UpdateLayout() targetBitmap.Render(control);

因此,新代碼如下所示:

            // get byte-array from file
            using (var xamlStream = new MemoryStream((byte[])value))
            using (var stream = new MemoryStream())
            {
                var dataContext = new DataPackageController();
                dataContext.SetData(context);

                var thread = new Thread(() =>
                {
                    // load xaml control from stream
                    var control = (System.Windows.Controls.Canvas)System.Windows.Markup.XamlReader.Load(xamlStream);
                    if (control == null)
                        return;

                    control.DataContext = new { Person = new { FIRSTNAME = "Test" } };
                    control.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));

                    // get size of control which would be needed by Window
                    var controlSize = control.DesiredSize;
                    var rect = new System.Windows.Rect(0, 0, controlSize.Width, controlSize.Height);

                    // render XAML to bitmap
                    var targetBitmap = new RenderTargetBitmap((int)controlSize.Width, (int)controlSize.Height, 120, 96, PixelFormats.Pbgra32);

                    control.Arrange(rect);
                    control.InvalidateVisual();
                    control.UpdateLayout();
                    targetBitmap.Render(control);

                    // convert to png and save to sream
                    var png = new PngBitmapEncoder();
                    png.Frames.Add(BitmapFrame.Create(targetBitmap));
                    png.Save(stream);
                });
                thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
                thread.Start();
                thread.Join();
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM