保存/恢复控件布局
DevExpress WPF控件允许您保存(序列化)他们的布局到 / ,然后恢复(反序列化)他们。
DevExpress WPF控件使用DXSerializer类来保存/恢复它们的布局,该类包含可用于自定义序列化/反序列化过程的事件。
保存/恢复单个控件的布局
1.为要保存/恢复其布局的控件(及其每个部分)定义唯一名称,DXSerializer使用这些名称来标识保存/恢复操作期间的元素。
<dx:ThemedWindow ... xmlns:dx="//schemas.devexpress.com/winfx/2008/xaml/core" xmlns:dxg="//schemas.devexpress.com/winfx/2008/xaml/grid"> <Grid> <dxg:GridControl x:Name="gridControl" ...> <dxg:GridControl.Bands> <dxg:GridControlBand Name="band1" ... > <!-- ... --> </dxg:GridControlBand> <dxg:GridControlBand Name="band2" ... > <!-- ... --> </dxg:GridControlBand> </dxg:GridControl.Bands> <dxg:GridControl.View> <dxg:TableView/> </dxg:GridControl.View> </dxg:GridControl> </Grid> </dx:ThemedWindow>
如果从视图模型集合生成控件的元素,则不能使用绑定来定义元素的Name属性,相反使用DevExpress.Xpf.Core.XamlHelper.Name附加属性将View Model中指定的名称传递给元素的name属性:
<DataTemplate x:Key="BandTemplate"> <dxg:GridControlBand ... dx:XamlHelper.Name="{Binding Path=(dxci:DependencyObjectExtensions.DataContext).UniqueName, RelativeSource={RelativeSource Self}}"/> </DataTemplate>
2.调用控件的SaveLayoutTo*方法来保存其布局。
C#:
using DevExpress.Xpf.Core.Serialization; // ... Stream gridControlLayout = new MemoryStream(); private void Button_Click(object sender, RoutedEventArgs e) { gridControl.SaveLayoutToStream(gridControlLayout); }
VB.NET:
using DevExpress.Xpf.Core.Serialization; // ... Stream gridControlLayout = new MemoryStream(); private void Button_Click(object sender, RoutedEventArgs e) { gridControl.SaveLayoutToStream(gridControlLayout); }
3.要恢复保存到XML文件中的控件布局,请调用控件的RestoreLayoutFromXML方法,要恢复保存到流中的控件布局,调用控件的RestoreLayoutFromStream方法。
C#:
using DevExpress.Xpf.Core.Serialization; // ... private void Button_Click_1(object sender, RoutedEventArgs e) { gridControl.RestoreLayoutFromStream(gridControlLayout); }
VB.NET:
Imports DevExpress.Xpf.Core.Serialization Private Sub Button_Click_1(ByVal sender As Object, ByVal e As RoutedEventArgs) gridControl.RestoreLayoutFromStream(gridLayoutStream) End Sub
支持的控件及其保存/恢复方法
提示:如果控件使用DXSerializer类保存/恢复其布局,则可以使用DXSerializer的事件自定义控件的序列化/反序列化。
局限性
LayoutControlBase及其后代的WriteToXML(XmlWriter)和ReadFromXML(XmlReader)方法不使用DXSerializer类,使用DXSerializer定制这些控件的序列化/反序列化(例如,取消布局恢复、从集合中恢复项,等等)。
每个控件将其布局保存到单独的XML文件/ stream_。
保存/恢复容器及其子控件的布局
使用DXSerializer保存/恢复容器的布局(窗口,视图,用户控制,控制)和它的子序列化[1]DevExpress WPF控件到XML文件/流。
支持的控件
- Bars
- ChartControl
- Data Layout Control/LayoutControl/TileLayoutControl/FlowLayoutControl
- DockLayoutManager
- DXTabControl
- GridControl/GanttControl/TreeListControl
- PivotGridControl
- RibbonControl
- ThemedWindow
局限性
DXSerializer保存/恢复存在于应用程序可视化树中的控件的布局,因此,它不会保存/恢复未打开的DXTabControl/LayoutGroup选项卡的内容。
为了保存/恢复可序列化的[1]DevExpress WPF控件的布局,将其放置在DXTabControl/LayoutGroup选项卡中,设置选项卡的DXTabControl.TabContentCacheMode/LayoutGroup.TabContentCacheMode属性为TabContentCacheMode.CacheAllTabs,在这种情况下,选项卡在加载控件时将其内容加载到可视树中。
保存(序列化)布局
1.选择要保存/恢复其布局的目标对象,它可以是任何存储可序列化的DevExpress WPF控件的父容器(Window, View, UserControl)。
2.如果您的目标对象包含多个相同类型的可序列化子对象,请为每个对象指定唯一的serializationid(在容器中)。
提示:RibbonControl及其类别/页面/组的每个实例也应该具有唯一的SerializationID附加属性值。
3.调用任意XSerializer.Serialize方法,序列化方法将可视化DevExpress控件的布局保存到单个XML文件/流中。
4.调用任意DXSerializer.Serialize方法,这些方法将可视化DevExpress控件的布局保存到单个XML文件/流中。
下面的代码将窗口及其子控件的布局保存到一个XML文件中:
XAML:
<Window . . . xmlns:dx="//schemas.devexpress.com/winfx/2008/xaml/core" x:Name="mainWindow"> <Grid> <dxg:GridControl dx:DXSerializer.SerializationID="gridControl1"> <!--...--> </dxg:GridControl> <dxg:GridControl dx:DXSerializer.SerializationID="gridControl2"> <!--...--> </dxg:GridControl> </Grid> </Window>
C#:
using DevExpress.Xpf.Core.Serialization; private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { DXSerializer.Serialize(mainWindow, "Layout.xml"); }
VB.NET:
Imports DevExpress.Xpf.Core.Serialization Private Sub Window_Closing(ByVal sender As Object, ByVal e As RoutedEventArgs) DXSerializer.Serialize(mainWindow, "Layout.xml"); End Sub
还原(反序列化)布局
要恢复保存的布局,您应该使用DXSerializer.Deserialize方法,该方法对应于保存的布局结构(XML文件或 Stream)。
例如,如果你保存了一个控件的布局到一个 Stream中(使用DXSerializer.Serialize(DependencyObject,Stream)方法),应该调用DXSerializer.Deserialize(DependencyObject,Stream))方法从那个 中恢复保存的布局。
下面的代码恢复了上一节中保存的主窗口及其子GridControls的布局:
C#:
using DevExpress.Xpf.Core.Serialization; private void Window_Loaded(object sender, RoutedEventArgs e) { DXSerializer.Deserialize(mainWindow, "Layout.xml"); }
VB.NET:
Imports DevExpress.Xpf.Core.Serialization Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) DXSerializer.Deserialize(mainWindow, "Layout.xml"); End Sub
MVVM支持
要在MVVM应用程序中保存/恢复应用程序布局,您可以使用LayoutSerializationService和CurrentWindowSerializationBehavior类。
:Serialize/Deserialize a View's Size and State with LayoutSerializationService and CurrentWindowSerializationBehavior
这些类基于DXSerializer,您可以使用它的事件来定制布局的保存/恢复过程。
保存和恢复应用的主题
分别调用SaveApplicationThemeName/UpdateApplicationThemeName方法来保存/恢复应用于应用程序的主题。
下面的代码示例在应用程序退出时保存应用的主题,并在应用程序启动时恢复它:
App.xaml.cs:
public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); DevExpress.Xpf.Core.ApplicationThemeHelper.UpdateApplicationThemeName(); } protected override void OnExit(ExitEventArgs e) { base.OnExit(e); DevExpress.Xpf.Core.ApplicationThemeHelper.SaveApplicationThemeName(); } private void OnAppStartup_UpdateThemeName(object sender, StartupEventArgs e) { DevExpress.Xpf.Core.ApplicationThemeHelper.UpdateApplicationThemeName(); } }Application.xaml.vb:
Partial Public Class App Inherits Application Protected Overrides Sub OnStartup(ByVal e As StartupEventArgs) MyBase.OnStartup(e) DevExpress.Xpf.Core.ApplicationThemeHelper.UpdateApplicationThemeName() End Sub Protected Overrides Sub OnExit(ByVal e As ExitEventArgs) MyBase.OnExit(e) DevExpress.Xpf.Core.ApplicationThemeHelper.SaveApplicationThemeName() End Sub Private Sub OnAppStartup_UpdateThemeName(ByVal sender As Object, ByVal e As StartupEventArgs) DevExpress.Xpf.Core.ApplicationThemeHelper.UpdateApplicationThemeName() End Sub End Class
高级场景
您可以使用DXSerializer的事件来执行以下操作:
- 保存/恢复DevExpress WPF控件后代的