尝试从XAML页面创建图像时WPF获取Null错误

时间:2016-03-14 18:05:58

标签: c# wpf xaml png

我是C#编程的新手,很难在不同的类中引用xaml文件。

我正在尝试创建一个程序,它将从Xaml页面生成PNG文件。我能够从MainWindow.xaml捕获Canvas,但我想从另一个名为overlay.xaml的XAMl文件中获取它。

我已经将Overlay.xaml添加为页面,但是当我在MainWindow.xaml.cs类中引用它时,我得到一个NULL值错误。我的假设是因为overlay.xaml页面从未被初始化,所有值都为null。如何导入或初始化overlay.xaml?

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public overlay overlay2;
    public MainWindow()
    {
        InitializeComponent();   
    }

    public void CaptureImage()
    {
        Rect rect = new Rect(overlay2.OverylayCanvas.RenderSize);  <--- Returns the null error
        RenderTargetBitmap rtb = new RenderTargetBitmap((int)rect.Right,
            (int)rect.Bottom, 96d, 96d, System.Windows.Media.PixelFormats.Default);
        rtb.Render(overlay2.OverylayCanvas);
        //encode as PNG
        BitmapEncoder pngEncoder = new PngBitmapEncoder();
        pngEncoder.Frames.Add(BitmapFrame.Create(rtb));

        //Save to memory
        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        pngEncoder.Save(ms);
        ms.Close();
        System.IO.File.WriteAllBytes("Generated_Image.png", ms.ToArray());
        Console.WriteLine("Done");
    }
}

Overlay.xaml

<Page x:Class="WpfApplication1.overlay"
  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" 
  xmlns:local="clr-namespace:ScoreboardUpdate"
  mc:Ignorable="d" 
  d:DesignHeight="150" d:DesignWidth="500"
  Title="overlay">

<Canvas x:Name="OverylayCanvas" Canvas.Left="0" Canvas.Top="20" x:FieldModifier="public">
    <Rectangle Fill="#FFF4F4F5" Height="72" Canvas.Left="58" Stroke="Black" Canvas.Top="37" Width="258"/>
</Canvas>

1 个答案:

答案 0 :(得分:2)

好吧,您可以在overlay2构造函数

中创建MainWindow
public overlay overlay2;

public MainWindow()
{
    InitializeComponent();   
    overlay2 = new Overlay();
}

或者您可以在MainWindow.xaml文件中初始化它。

<Window x:Class="WpfApplication1...         
     ....
     <WpfApplication1:overlay x:Name="overlay2"></WpfApplication1:overlay>
     ....
</Window>

然后你应该从MainWindow.xaml.cs中删除overlay2声明,因为它已经在xaml文件中声明了。

public partial class MainWindow : Window
{
    // public overlay overlay2; <-- is already declared in xaml.

    public MainWindow()
    {
        InitializeComponent();   
    }