logo Devexpress WPF控件文档中心
文档首页>>Devexpress WPF控件文档中心>>保存/恢复控件布局

保存/恢复控件布局


立即下载DevExpress WPF

DevExpress WPF控件允许您保存(序列化)他们的布局到XML file /Stream ,然后恢复(反序列化)他们。

DevExpress WPF控件使用DXSerializer类来保存/恢复它们的布局,该类包含可用于自定义序列化/反序列化过程的事件。

保存/恢复单个控件的布局

1.为要保存/恢复其布局的控件(及其每个部分)定义唯一名称,DXSerializer使用这些名称来标识保存/恢复操作期间的元素。

<dx:ThemedWindow ...
xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core"
xmlns:dxg="http://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

支持的控件及其保存/恢复方法

 WinForms 控件保存恢复方法


提示:如果控件使用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="http://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))方法从那个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类。

View Example: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的事件来执行以下操作:

在线咨询
联系我们

客服热线
023-68661681

QQ客服

意见反馈


添加微信获专业服务

TOP