• <menu id="w2i4a"></menu>
  • logo Devexpress WPF控件文檔中心
    文檔首頁(yè)>>Devexpress WPF控件文檔中心>>保存/恢復(fù)控件布局

    保存/恢復(fù)控件布局


    立即下載DevExpress WPF

    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ù)方法

     WinForms 控件保存恢復(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í)行以下操作:

    掃碼咨詢


    添加微信 立即咨詢

    電話咨詢

    客服熱線
    023-68661681

    TOP
    三级成人熟女影院,欧美午夜成人精品视频,亚洲国产成人乱色在线观看,色中色成人论坛 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();