对象序列化(六):应用实例->WPF对象的XAML序列化
2012-02-15 00:07
274 查看
WPF使用XAML来描述用户界面,每个XAML元素往往对应着相应的WPF对象,元素的属性对应着对象的属性。
由于XAML元素与WPF对象之前存在着这种对应关系,其实可以将XAML代码看成是WPF对象“序列化”后的结果。
WPF提供了XamlWriter 和 XamlReader 两个类实现WPF对象的XAML序列化和反序列化。
示例项目:
展示了一个绘图板,用户用鼠标点击此绘图板,程序将以随机颜色和大小绘制一个矩形,点击“保存”按钮,当前图形将被保存到磁盘上一个名为“PicData.dat” 的文件中,点击“重建”按钮,将恢复上次保存的图形。
前台的XAML代码:
后台CS代码:
如果用记事本打开 PicData.dat文件。可以看到其内容为XAML代码。它就是XamlWriter 的序列化结果。
由于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>
相关文章推荐
- 对象序列化(七):应用实例->asp.net ViewState
- 对象序列化(五):应用实例->大批量复制对象
- 对象序列化(六):应用实例->程序退出时保存状态
- WPF/Silverlight 中利用XamlReader /Writer 来处理对象的序列化反序列化
- WPF架构关键技术剖析(2)--XAML、对象序列化、类动态实例化
- WPF架构关键技术剖析(2)--XAML、对象序列化、类动态实例化
- Wpf Xaml间接查找控件或用x:name来应用控件实例
- WPF对象的XAML序列化
- 在WPF中,如何得到任何Object对象的XAML代码?_.Net实例_电脑学网...
- java--对象自定义序列化简单应用,用于性能的优化
- 关于Java对象序列化的应用~~~
- Serializable对象序列化实例
- 用序列化实现List<T> 实例的深复制(推荐)
- fastJson如何序列化一个包含list对象的Map对象,如Map<String,List<T>>类型的对象
- asp.net f发布网站 出现未将对象应用到实例
- Gson 序列化对象和反序列化 实例
- Android深入浅出系列之实例应用—弹出消息Toast对象的使用纯文本方式(一)
- Spring MVC中 Json序列化对象实例的问题和两个办法
- JavaScript入门<2>JavaScript常用内置对象实例详解
- 对象的序列化NSObject<NSCoding>