【问题标题】:How to get FrameworkElement properties before its unloading如何在卸载之前获取 FrameworkElement 属性
【发布时间】:2010-10-11 19:16:46
【问题描述】:

需要实现UI设置系统-从/到持久存储中加载/保存UI元素的一些属性(可以由用户在运行时修改)。例如:

  • DevExpress 网格控件 - 列宽、可见性、汇总区域等(此控件具有一组方法对,例如 RestoreLayoutFrom/SaveLayoutTo,但 SaveLayoutToStream(Xml) 在网格中不起作用。未加载的处理程序 - 当网格与 PresentationSource 断开连接时)
  • 网格行/列,用户可以通过 GridSplitter 调整其宽度/高度
  • 相当大的弹出控件

在控件加载/初始化/等之后从设置存储中设置控件属性很容易,但是如何捕捉控件卸载之前的时刻(当它们仍然保留在可视树中时)以检索它们的设置以进行保存?

简短说明

我打算创建单例 - UISettingsManager,其中有一个字典,其中包含成对的 [元素 Uid,元素设置数据]。在可视化容器(Window、UserControl)中,这个管理器可以这样使用:

public partial class PageHeader : UserControl
{
    public PageHeader()
    {
        InitializeComponent();

        UISettingsManager.RestoreSettings(myGridControl);
        UISettingsManager.RestoreSettings(myPopup);
    }
}

myGridControl 和 myPopup 具有唯一的 Uid(在应用程序范围内),因此 UISettingsManager 可以从内部字典中检索它们的设置并将其应用于控件;当然 UISettingsManager 知道如何使用一些不同类型的控件。

但是在存储控件设置的正确时机时,哪个容器是 Window 或 UserControl?

【问题讨论】:

    标签: wpf wpf-controls frameworkelement


    【解决方案1】:

    我会使用 Window 的 Closing 事件。

    public class MyWindow : Window
    {
        public MyWindow()
        {
            this.Closing += new System.ComponentModel.CancelEventHandler(MyWindow_Closing);
        }
    
        void MyWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Save what I want to here
        }
    }
    

    这是最安全的选择,因为您总是会在某个时候关闭窗口。

    但是,可能还有其他选择,包括用户控件的 Unloaded 事件。

    【讨论】:

    • 好吧,我很抱歉,因为禁止 Windows.Closing 事件。我的大部分控件都放在了 UserControls 中,它会在窗口内容区域中不时更改窗口而不关闭窗口
    • 我已经更新了我的答案以表明您可以使用控件的 Unloaded 事件,但这完全取决于您的设计。您可能会在将“新”视图“加载”到内容区域之前保存有关“旧”视图的信息。
    • 我的应用程序会有一些窗口,每个窗口都有自己的简单控件和用户控件,用于将控件分组。主窗口内容会随着底层 ViewModel 的变化而变化。这种方法可以在 Web 浏览器示例中进行说明:主窗口包含页面(而主模型包含一组 PageModel 实例),每个页面都有一组工作区,其中只有一个是可见的(PageModel 具有 List 和 CurrentWorkspace 属性)。
    • 每个 WorkspaceModel 子类都有相应的 WorkspaceView (UserControl)。用户可以通过更改 PageModel.CurrentWorkspace 的值来浏览列表中的工作区,之后 PageView.Content 会自动更改以可视化正确的 WorkspaceView。所以加载和卸载不同的视图,我需要使用第 1 篇文章中显示的方法(UISettingsManager 等)保存他们的控件的道具。
    • 所以问题似乎在 UserControl 模拟中发现不存在的 BeforeUnloading 事件,在其他情况下,我需要在 View 子系统的很多非常不同的地方执行保存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 2023-03-05
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    相关资源
    最近更新 更多