WPF对象的XAML序列化

来源:互联网 发布:淘宝店铺如何暂时关闭 编辑:程序博客网 时间:2024/06/05 21:51

WPF使用XAML来描述用户界面,每个XAML元素往往对应着相应的WPF对象,元素的属性对应着对象的属性。

由于XAML元素与WPF对象之前存在着这种对应关系,其实可以将XAML代码看成是WPF对象“序列化”后的结果。

WPF提供了XamlWriter 和 XamlReader  两个类实现WPF对象的XAML序列化和反序列化。

 

示例项目:

展示了一个绘图板,用户用鼠标点击此绘图板,程序将以随机颜色和大小绘制一个矩形,点击“保存”按钮,当前图形将被保存到磁盘上一个名为“PicData.dat” 的文件中,点击“重建”按钮,将恢复上次保存的图形。

 

前台的XAML代码:


<Window x:Class="SaveAndReloadXAMLObject.Window1"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    Title="WPF对象的序列化" Height="300" Width="320">    <DockPanel>        <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" HorizontalAlignment="Center" Margin="10">        <Button Margin="5" Width="80" Name="btnSave" Click="btnSave_Click">保存</Button>         <Button Margin="5" Width="80" Name="btnClear" Click="btnClear_Click">清空</Button>            <Button Margin="5" Width="80" Name="btnLoad" Click="btnLoad_Click">重建</Button>        </StackPanel>        <Border x:Name="DrawPanelBorder" BorderBrush="Black"  Background="Black" CornerRadius="5" Margin="5" Padding="2">          <Canvas x:Name="DrawPanel"  Background="White" MouseDown="Canvas_MouseDown"></Canvas>        </Border>    </DockPanel></Window>

后台CS代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Markup;
using System.IO;

namespace SaveAndReloadXAMLObject
{
    /// <summary>
/// Window1.xaml 的交互逻辑
/// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            CurCanvas = DrawPanel;
        }

        private Canvas CurCanvas = null;
        private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //获取当前鼠标的位置
            Point curP = e.GetPosition(sender as Canvas);
            Random ran = new Random();
            Color clr = Color.FromRgb((byte)ran.Next(0,255), (byte)ran.Next(0,255), (byte)ran.Next(0,255));
            Brush br = new SolidColorBrush(clr);
            Rectangle rect = new Rectangle();
            rect.Width = ran.Next(1, (int)(CurCanvas.ActualWidth - curP.X -5));
            rect.Height = ran.Next(1, (int)(CurCanvas.ActualHeight - curP.Y -5));
            rect.SetValue(Canvas.TopProperty, curP.Y);
rect.SetValue(Canvas.LeftProperty, curP.X);
            rect.Fill = br;
            CurCanvas.Children.Add(rect);



        }

        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            using (FileStream fs = new FileStream("PicData.dat", FileMode.Create))
            {
                //当需要保存当前图形时,调用XamlWriter的以下方法将Canvas对象直接序列化到文件流中
                XamlWriter.Save(CurCanvas, fs);

                MessageBox.Show("数据已保存");
            }
        }
        private void btnLoad_Click(object sender, RoutedEventArgs e)
        {
            using (FileStream fs = new FileStream("PicData.dat", FileMode.Open))
            {
                //double oldWidth = DrawPanelBorder.ActualWidth;
//double oldHeight = DrawPanelBorder.ActualHeight;
//调用XamlReader的方法从文件流中重建canvas对象
                CurCanvas = XamlReader.Load(fs) as Canvas;
                //CurCanvas.Width = oldWidth;
//CurCanvas.Height = oldHeight;
CurCanvas.MouseDown += Canvas_MouseDown;
                DrawPanelBorder.Child = CurCanvas;

            }
        }

        private void btnClear_Click(object sender, RoutedEventArgs e)
        {
            CurCanvas.Children.Clear();
        }

    }
}

如果用记事本打开 PicData.dat文件。可以看到其内容为XAML代码。它就是XamlWriter 的序列化结果。

<Canvas Background="#FFFFFFFF" Name="DrawPanel" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><RectangleFill="#FF0A83CB" Width="139" Height="103" Canvas.Left="58" Canvas.Top="24.1633333333333"/></Canvas>

0 0