Мне было поручено создать пользовательский интерфейс приложения Winforms, написанный на VB, чтобы сохранить положение нескольких разделителей SplitContainer и размер окна. Я покажу код для SplitContainers ниже. Код для окна очень похож, но обращается к различным свойствам. Обратите внимание, что все значения SplitContainer сохраняются как целочисленные и присваиваются пользовательской области.
Код довольно прост. Когда форма загружается, я проверяю My.Settings.SettingsLoaded, который по умолчанию равен False. Если это False, я беру текущую позицию по умолчанию и пишу, сохраняя их.
Private Sub InitSettings()
If My.Settings.SettingsLoaded <> True Then
UpdateWindowSettingsData()
UpdateSplitContainerSettingsData()
My.Settings.SettingsLoaded = True
My.Settings.Save()
End If
isLoading = False
ScaleWindow()
ScaleUIElements()
End Sub
Вторая часть этого запускается каждый раз, когда форма загружает и позиционирует рассматриваемые элементы
Private Sub ScaleUIElements()
isLoading = True
SuspendLayout()
SplitContainer3.SplitterDistance = My.Settings.SplitContainer3
SplitContainer8.SplitterDistance = My.Settings.SplitContainer8
SplitContainer10.SplitterDistance = My.Settings.SplitContainer10
SplitContainer20.SplitterDistance = My.Settings.SplitContainer20
SplitContainer21.SplitterDistance = My.Settings.SplitContainer21
ResumeLayout()
isLoading = False
End Sub
Затем я добавил несколько обработчиков, чтобы поймать пользовательские манипуляции
Private Sub SplitterMoved(ByVal sender As System.Object, ByVal e As System.Windows.Forms.SplitterEventArgs) Handles SplitContainer3.SplitterMoved, SplitContainer8.SplitterMoved, SplitContainer20.SplitterMoved, SplitContainer21.SplitterMoved, SplitContainer10.SplitterMoved
If isLoading Then
Return
End If
UpdateSplitContainerSettingsData()
End Sub
Обновление данных также довольно просто
Private Sub UpdateSplitContainerSettingsData()
My.Settings.SplitContainer3 = SplitContainer3.SplitterDistance
My.Settings.SplitContainer8 = SplitContainer8.SplitterDistance
My.Settings.SplitContainer10 = SplitContainer10.SplitterDistance
My.Settings.SplitContainer20 = SplitContainer20.SplitterDistance
My.Settings.SplitContainer21 = SplitContainer21.SplitterDistance
My.Settings.Save()
End Sub
Пока я работаю над этим, я отслеживаю файл user.config, используя Tail.exe . Это позволяет мне видеть обновления настроек по мере их сохранения. Я даже дошел до того, что настроил его так, чтобы при обновлении документа звучал звук.
Что я вижу, так это то, что, перемещая сплиттеры в SplitContainer, я могу видеть, как события запускаются, как и положено, устанавливая точки останова. Тем не менее, я также могу наблюдать, как он достигает точки останова, обновлять настройки, проходить после строки сохранения и абсолютно не обновлять документ. Это работает около 40% времени и кажется совершенно случайным. Я потратил почти целый день на то, чтобы заставить это работать, и я нахожусь в том же месте, где я был, когда писал код изначально. Я не могу найти ничего, что указывало бы на то, что кто-либо когда-либо видел такое поведение раньше, и я уверен, что мой код работает так, как должен, но по какой-то причине приложение не может выполнить запись в файл.
У меня довольно убедительные признаки того, что это правда. Когда вызывается My.Settings.Save () и значения не обновляются в Tail.exe, текст состояния в левом нижнем углу говорит: «Ожидание файла ...». Когда это работает, текст говорит: «Последнее обновление: XX: XX: XX» (отметка времени). Ожидание файла никогда не исчезнет, если я просто оставлю его.
![enter image description here](https://i.stack.imgur.com/uAsCp.png)
Итак, мне было интересно, сталкивался ли кто-нибудь еще с подобным поведением. Если так, как я могу заставить настройки заканчивать писать? Будет ли мне лучше использовать стороннее решение? Конечно, если вы обнаружите что-то, что я делаю неправильно, при сохранении этих настроек, пожалуйста, дайте мне знать.
Спасибо за любую помощь!