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();
}
}
}
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
- WPF对象的XAML序列化
- WPF架构关键技术剖析(2)--XAML、对象序列化、类动态实例化
- WPF:动态加载xaml对象
- WPF XAML的命名空间
- WPF Summary:XAML的介绍
- [WPF,XAML] 跳动的心
- 在WPF中,如何得到任何Object对象的XAML代码?
- WPF中,怎样将XAML代码加载为相应的对象?
- 在WPF中,如何得到任何Object对象的XAML代码?
- 深入浅出WPF——XAML的优点
- WPF指南之XAML的名字空间
- WPF中CAD control的XAML实现
- WPF中XAML的编译过程
- WPF学习---系统的学习XAML语法
- 创建不使用XAML的WPF程序
- WPF学习---系统的学习XAML语法
- WPF中XAML文件的基本格式
- WPF的XAML中字符转义
- 数据库_ PL/SQL 怎么判断两个结果集是否相等
- 理解android与服务器交互
- ssh环境搭建(1)-lib篇(spring4.2.6+struts2.5+hibernate5.1 )
- el表达式取出集合等元素
- cuda纹理内存使用
- WPF对象的XAML序列化
- OpenGLES---加载文字
- TCP协议传输
- Android屏幕density, dip等相关概念总结
- log4j的配置文件配置出多个logger
- 用array_count_values统计一篇英文文档中每个单词的出现次数,结果用表格展示出来
- 全国十大热招职能,企业薪资数据揭秘
- 超详细的django1.8处理centos下nginx上处理静态文件步骤!
- WYDC项目开发