C# сохранить положение нескольких сплиттеров в файле user.config

В моей winform есть некоторый Splitter для разделения некоторых видов данных, есть ли способ сохранить (и восстановить) позицию разделителя в user.config?

Я хотел бы избежать добавления параметра с другим именем для каждого сплиттера, если это возможно.

заранее спасибо

2 ответа

Решение

Я придумал что-то, что вы можете использовать. Несколько вещей об этом примере:

  • я использовал SplitContainer, но я полагаю, вы могли бы приспособить это довольно легко.
  • Я только сканирую список элементов управления формы - этот метод не подхватит все SplitContainer (вам, вероятно, нужно сделать это рекурсивно).
  • Предполагается, что у вас есть пользовательский параметр SplitterPositions типа string,
  • Это не учитывает будущие изменения в форме (т. Е. Перераспределение элементов управления, добавление новых разделов, удаление существующих разделов и т. Д.), Поэтому это немного хрупко в этом отношении.

Я бы лично рекомендовал присваивать имена Splitterс (или SplitContainers, в зависимости от того, какой тип вы используете), поскольку это должно оградить вас от упомянутых мною проблем.

В любом случае, я надеюсь, что это поможет.

public Form1()
{
    InitializeComponent();

    Closing += Form1_Closing;

    ApplySavedSplitterData();
}

void Form1_Closing(object sender, CancelEventArgs e)
{
    SaveSplitterData();
}

private void SaveSplitterData()
{
    Settings.Default.SplitterPositions = string.Join(";", 
                     Controls.OfType<SplitContainer>()
                             .Select(s => s.SplitterDistance));

    Settings.Default.Save();
}

private void ApplySavedSplitterData()
{
    if (string.IsNullOrEmpty(Settings.Default.SplitterPositions))
    {
        return;
    }

    var positions = Settings.Default.SplitterPositions
                               .Split(';')
                               .Select(int.Parse).ToList();

    var splitContainers = Controls.OfType<SplitContainer>().ToList();

    for (var x = 0; x < positions.Count && x < splitContainers.Count; x++)
    {
        splitContainers[x].SplitterDistance = positions[x];
    }
}

Вы можете использовать библиотеку из статьи " Настройки пользователя", чтобы сохранить положение разделителя в настройках пользователя.

Кроме того, вы можете сохранить размер / местоположение формы и любые пользовательские настройки формы.

Другие вопросы по тегам