Как получить свойства FrameworkElement перед его выгрузкой - PullRequest
0 голосов
/ 11 октября 2010

Необходимо реализовать систему настроек пользовательского интерфейса - загрузку / сохранение некоторых свойств элементов пользовательского интерфейса (которые могут быть изменены пользователем во время выполнения) из / в постоянное хранилище.Например:

  • Элемент управления сеткой DevExpress - ширина столбцов, видимость, область сводки и т. Д. (Этот элемент управления имеет набор пар методов, таких как RestoreLayoutFrom / SaveLayoutTo, но SaveLayoutToStream (Xml) не работает в grid.Unloadedобработчик - когда сетка отключена от PresentationSource)
  • строк / столбцов сетки, ширину / высоту сетки которых пользователь может настроить с помощью GridSplitter
  • всплывающих элементов управления размером

ItЛегко настроить свойства элементов управления из хранилища настроек после загрузки / инициализации элементов управления и т. д., но как поймать момент перед выгрузкой элементов управления (когда они все еще остаются в визуальном дереве), чтобы получить их настройки для сохранения?

Краткое описание

Я собираюсь создать синглтон - UISettingsManager, внутри которого есть словарь с парами [element Uid, данные настроек элемента].В визуальном контейнере (Window, UserControl) этот менеджер можно использовать следующим образом:

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

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

myGridControl & myPopup имеет уникальные Uid (в области приложения), поэтому UISettingsManager может получить свои настройки из внутреннего словаря &применить его к элементам управления;Конечно, UISettingsManager знает, как работать с некоторыми различными типами элементов управления.

Но когда настал подходящий момент для сохранения настроек элементов управления, каким контейнером является Window или UserControl?

1 Ответ

1 голос
/ 11 октября 2010

Я бы использовал окно Закрытие событие.

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
    }
}

Это была бы самая безопасная ставка, потому что вы всегда в какой-то момент закроетеwindow.

Однако могут быть альтернативы, включая событие Unloaded для пользовательского элемента управления.

...