Spl Container SplitterDistance изменяется без вмешательства пользователя

Приложение My Winforms сохраняет и восстанавливает свое состояние графического интерфейса в базе данных. Все работает нормально, за исключением SplitterDistance Split Container.

Значение правильно загружается и устанавливается из БД, но когда я выхожу из приложения, не касаясь сплиттера, я ожидаю, что оно сохранит то же значение. Но это сохраняет начальное значение минус 25 пикселей. Если я много раз открываю и закрываю приложение, расстояние разветвителя уменьшается на 25 пикселей каждый раз.

Это не пользовательский элемент управления, просто старый.NET SplitContainer. Доступ к элементу управления осуществляется только программно, чтобы загрузить его начальный SplitterDistance и сохранить его при выходе, больше ничего.

Как я могу устранить это?

ОБНОВЛЕНИЕ: Spl FixedPanel свойство изначально было установлено None, Пытался установить его Panel1 а также Panel2; в обоих случаях SplitterDistance увеличивается на 50 пикселей при сохранении.

1 ответ

Решение

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

Чтобы устранить это, установите свойство FixedPanel и соблюдайте его.

скачать пример приложения

        // my splitContainer1 is Horizontal so i used splitContainer1.ClientSize.Height 
        // if you have splitContainer1 is Vertical use splitContainer1.ClientSize.Width
        // without FixedPanel save and load """  
        // loading SplitterDistance from ini file
        int splitContainery = 0;
        splitContainery = (Win32.GetPrivateProfileInt(PluginName, "splitContainer", 0, iniFilePath));
        splitContainer1.SplitterDistance = splitContainer1.ClientSize.Height - splitContainery;

        // saving splitContainer1.SplitterDistance to ini file
        int hhkt = splitContainer1.ClientSize.Height - splitContainer1.SplitterDistance;
        Win32.WritePrivateProfileString(PluginName, "splitContainer", hhkt.ToString(), iniFilePath);

Я использовал приведенный выше ответ следующим образом (мой разделитель вертикальный):

private void Form1_Load(object sender, EventArgs e) 
{
    int splitContainery = Properties.Settings.Default.SplitterDistance;
    if(splitContainery < splContainer.ClientSize.Width)
        splContainer.SplitterDistance = splContainer.ClientSize.Width - splitContainery;
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    int splitContainery = splContainer.ClientSize.Width - splContainer.SplitterDistance;
    Properties.Settings.Default.SplitterDistance = splitContainery;
    Properties.Settings.Default.Save();            
}

Я создал PropertyBinding для splContainer.SplitterDistance, но не привязывал его к свойству, просто чтобы он был в файле ApplicationSettings.

int splitContainery = Properties.Settings.Default.SplitterDistance;

если бы я мог использовать Properties.Settings.Default.SplitterDistanceпоэтому я никогда не смогу использовать файл ini, например

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