您的位置:首页 > 其它

对象序列化(六):应用实例->WPF对象的XAML序列化

2012-02-15 00:07 274 查看
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"><Rectangle Fill="#FF0A83CB" Width="139" Height="103" Canvas.Left="58" Canvas.Top="24.1633333333333" /></Canvas>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: