保存/恢復(fù)控件布局
DevExpress WPF控件允許您保存(序列化)他們的布局到XML file /Stream ,然后恢復(fù)(反序列化)他們。
DevExpress WPF控件使用DXSerializer類(lèi)來(lái)保存/恢復(fù)它們的布局,該類(lèi)包含可用于自定義序列化/反序列化過(guò)程的事件。
保存/恢復(fù)單個(gè)控件的布局
1.為要保存/恢復(fù)其布局的控件(及其每個(gè)部分)定義唯一名稱,DXSerializer使用這些名稱來(lái)標(biāo)識(shí)保存/恢復(fù)操作期間的元素。
<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>
如果從視圖模型集合生成控件的元素,則不能使用綁定來(lái)定義元素的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.調(diào)用控件的SaveLayoutTo*方法來(lái)保存其布局。
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.要恢復(fù)保存到XML文件中的控件布局,請(qǐng)調(diào)用控件的RestoreLayoutFromXML方法,要恢復(fù)保存到流中的控件布局,調(diào)用控件的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
支持的控件及其保存/恢復(fù)方法
提示:如果控件使用DXSerializer類(lèi)保存/恢復(fù)其布局,則可以使用DXSerializer的事件自定義控件的序列化/反序列化。
局限性
LayoutControlBase及其后代的WriteToXML(XmlWriter)和ReadFromXML(XmlReader)方法不使用DXSerializer類(lèi),使用DXSerializer定制這些控件的序列化/反序列化(例如,取消布局恢復(fù)、從集合中恢復(fù)項(xiàng),等等)。
每個(gè)控件將其布局保存到單獨(dú)的XML文件/ stream_。
保存/恢復(fù)容器及其子控件的布局
使用DXSerializer保存/恢復(fù)容器的布局(窗口,視圖,用戶控制,控制)和它的子序列化[1]DevExpress WPF控件到XML文件/流。
支持的控件
- Bars
- ChartControl
- Data Layout Control/LayoutControl/TileLayoutControl/FlowLayoutControl
- DockLayoutManager
- DXTabControl
- GridControl/GanttControl/TreeListControl
- PivotGridControl
- RibbonControl
- ThemedWindow
局限性
DXSerializer保存/恢復(fù)存在于應(yīng)用程序可視化樹(shù)中的控件的布局,因此,它不會(huì)保存/恢復(fù)未打開(kāi)的DXTabControl/LayoutGroup選項(xiàng)卡的內(nèi)容。
為了保存/恢復(fù)可序列化的[1]DevExpress WPF控件的布局,將其放置在DXTabControl/LayoutGroup選項(xiàng)卡中,設(shè)置選項(xiàng)卡的DXTabControl.TabContentCacheMode/LayoutGroup.TabContentCacheMode屬性為T(mén)abContentCacheMode.CacheAllTabs,在這種情況下,選項(xiàng)卡在加載控件時(shí)將其內(nèi)容加載到可視樹(shù)中。
保存(序列化)布局
1.選擇要保存/恢復(fù)其布局的目標(biāo)對(duì)象,它可以是任何存儲(chǔ)可序列化的DevExpress WPF控件的父容器(Window, View, UserControl)。
2.如果您的目標(biāo)對(duì)象包含多個(gè)相同類(lèi)型的可序列化子對(duì)象,請(qǐng)為每個(gè)對(duì)象指定唯一的serializationid(在容器中)。
提示:RibbonControl及其類(lèi)別/頁(yè)面/組的每個(gè)實(shí)例也應(yīng)該具有唯一的SerializationID附加屬性值。
3.調(diào)用任意XSerializer.Serialize方法,序列化方法將可視化DevExpress控件的布局保存到單個(gè)XML文件/流中。
4.調(diào)用任意DXSerializer.Serialize方法,這些方法將可視化DevExpress控件的布局保存到單個(gè)XML文件/流中。
下面的代碼將窗口及其子控件的布局保存到一個(gè)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
還原(反序列化)布局
要恢復(fù)保存的布局,您應(yīng)該使用DXSerializer.Deserialize方法,該方法對(duì)應(yīng)于保存的布局結(jié)構(gòu)(XML文件或 Stream)。
例如,如果你保存了一個(gè)控件的布局到一個(gè) Stream中(使用DXSerializer.Serialize(DependencyObject,Stream)方法),應(yīng)該調(diào)用DXSerializer.Deserialize(DependencyObject,Stream))方法從那個(gè)Stream 中恢復(fù)保存的布局。
下面的代碼恢復(fù)了上一節(jié)中保存的主窗口及其子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應(yīng)用程序中保存/恢復(fù)應(yīng)用程序布局,您可以使用LayoutSerializationService和CurrentWindowSerializationBehavior類(lèi)。
View Example:Serialize/Deserialize a View's Size and State with LayoutSerializationService and CurrentWindowSerializationBehavior
這些類(lèi)基于DXSerializer,您可以使用它的事件來(lái)定制布局的保存/恢復(fù)過(guò)程。
保存和恢復(fù)應(yīng)用的主題
分別調(diào)用SaveApplicationThemeName/UpdateApplicationThemeName方法來(lái)保存/恢復(fù)應(yīng)用于應(yīng)用程序的主題。
下面的代碼示例在應(yīng)用程序退出時(shí)保存應(yīng)用的主題,并在應(yīng)用程序啟動(dòng)時(shí)恢復(fù)它:
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
高級(jí)場(chǎng)景
您可以使用DXSerializer的事件來(lái)執(zhí)行以下操作: