Vb.net 属性绑定到设置时出现奇怪的拆分容器行为

Vb.net 属性绑定到设置时出现奇怪的拆分容器行为,vb.net,winforms,splitcontainer,Vb.net,Winforms,Splitcontainer,我有一个WinForms应用程序,它包含两个拆分容器。第一个SplitContainer跨越整个表单,其方向是水平的。第二个拆分容器位于第一个拆分容器的左面板内,且其方向垂直。我将每个拆分容器的SplitterDistance属性与应用程序设置绑定,以便在用户退出程序时保存位置。然而,这导致了奇怪的问题。如果我拖动主拆分容器的位置,然后拖动第二个拆分容器的位置,则第一个拆分容器将跳回原始位置,并且该位置不会保存。如果我移除第二个拆分容器,一切正常。如果SplitterDistance属性没有绑定

我有一个WinForms应用程序,它包含两个拆分容器。第一个SplitContainer跨越整个表单,其方向是水平的。第二个拆分容器位于第一个拆分容器的左面板内,且其方向垂直。我将每个拆分容器的SplitterDistance属性与应用程序设置绑定,以便在用户退出程序时保存位置。然而,这导致了奇怪的问题。如果我拖动主拆分容器的位置,然后拖动第二个拆分容器的位置,则第一个拆分容器将跳回原始位置,并且该位置不会保存。如果我移除第二个拆分容器,一切正常。如果SplitterDistance属性没有绑定,我也看不到这个问题

有人知道这是什么原因吗?或者我如何修复它

更新 我还发现,如果从第二个拆分容器中删除属性绑定,一切都会正常工作。即使我手动尝试实现此功能(即,删除属性绑定并在SplitContainer2.SplitterMoved事件中添加My.Settings.sideDist=SplitContainer2.SplitterDistance),问题仍然存在

我正在使用vb.net

设计器生成的代码:

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

    'Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.SplitContainer1 = New System.Windows.Forms.SplitContainer()
        Me.SplitContainer2 = New System.Windows.Forms.SplitContainer()
        Me.ListBox1 = New System.Windows.Forms.ListBox()
        Me.ListBox2 = New System.Windows.Forms.ListBox()
        CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SplitContainer1.Panel1.SuspendLayout()
        Me.SplitContainer1.Panel2.SuspendLayout()
        Me.SplitContainer1.SuspendLayout()
        CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SplitContainer2.Panel1.SuspendLayout()
        Me.SplitContainer2.SuspendLayout()
        Me.SuspendLayout()
        '
        'SplitContainer1
        '
        Me.SplitContainer1.DataBindings.Add(New System.Windows.Forms.Binding("SplitterDistance", Global.WindowsApplication1.My.MySettings.Default, "mainDist", True, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged))
        Me.SplitContainer1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.SplitContainer1.Location = New System.Drawing.Point(0, 0)
        Me.SplitContainer1.Name = "SplitContainer1"
        '
        'SplitContainer1.Panel1
        '
        Me.SplitContainer1.Panel1.Controls.Add(Me.SplitContainer2)
        '
        'SplitContainer1.Panel2
        '
        Me.SplitContainer1.Panel2.Controls.Add(Me.ListBox2)
        Me.SplitContainer1.Size = New System.Drawing.Size(730, 413)
        Me.SplitContainer1.SplitterDistance = Global.WindowsApplication1.My.MySettings.Default.mainDist
        Me.SplitContainer1.TabIndex = 0
        '
        'SplitContainer2
        '
        Me.SplitContainer2.DataBindings.Add(New System.Windows.Forms.Binding("SplitterDistance", Global.WindowsApplication1.My.MySettings.Default, "sideDist", True, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged))
        Me.SplitContainer2.Dock = System.Windows.Forms.DockStyle.Fill
        Me.SplitContainer2.Location = New System.Drawing.Point(0, 0)
        Me.SplitContainer2.Name = "SplitContainer2"
        Me.SplitContainer2.Orientation = System.Windows.Forms.Orientation.Horizontal
        '
        'SplitContainer2.Panel1
        '
        Me.SplitContainer2.Panel1.Controls.Add(Me.ListBox1)
        Me.SplitContainer2.Size = New System.Drawing.Size(310, 413)
        Me.SplitContainer2.SplitterDistance = Global.WindowsApplication1.My.MySettings.Default.sideDist
        Me.SplitContainer2.TabIndex = 0
        '
        'ListBox1
        '
        Me.ListBox1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.ListBox1.FormattingEnabled = True
        Me.ListBox1.Location = New System.Drawing.Point(0, 0)
        Me.ListBox1.Name = "ListBox1"
        Me.ListBox1.Size = New System.Drawing.Size(310, 49)
        Me.ListBox1.TabIndex = 0
        '
        'ListBox2
        '
        Me.ListBox2.Dock = System.Windows.Forms.DockStyle.Fill
        Me.ListBox2.FormattingEnabled = True
        Me.ListBox2.Location = New System.Drawing.Point(0, 0)
        Me.ListBox2.Name = "ListBox2"
        Me.ListBox2.Size = New System.Drawing.Size(416, 413)
        Me.ListBox2.TabIndex = 0
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(730, 413)
        Me.Controls.Add(Me.SplitContainer1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.SplitContainer1.Panel1.ResumeLayout(False)
        Me.SplitContainer1.Panel2.ResumeLayout(False)
        CType(Me.SplitContainer1, System.ComponentModel.ISupportInitialize).EndInit()
        Me.SplitContainer1.ResumeLayout(False)
        Me.SplitContainer2.Panel1.ResumeLayout(False)
        CType(Me.SplitContainer2, System.ComponentModel.ISupportInitialize).EndInit()
        Me.SplitContainer2.ResumeLayout(False)
        Me.ResumeLayout(False)

    End Sub
    Friend WithEvents SplitContainer1 As System.Windows.Forms.SplitContainer
    Friend WithEvents ListBox2 As System.Windows.Forms.ListBox
    Friend WithEvents SplitContainer2 As System.Windows.Forms.SplitContainer
    Friend WithEvents ListBox1 As System.Windows.Forms.ListBox

End Class
_
部分类Form1
继承System.Windows.Forms.Form
'窗体覆盖dispose以清理组件列表。
_
受保护的重写子处置(ByVal作为布尔值处置)
尝试
如果处理AndAlso组件不是什么,那么
components.Dispose()
如果结束
最后
MyBase.Dispose(Dispose)
结束尝试
端接头
'是Windows窗体设计器所必需的
作为System.ComponentModel.IContainer的专用组件
'注意:Windows窗体设计器需要以下过程
'可以使用Windows窗体设计器对其进行修改。
'不要使用代码编辑器修改它。
_
私有子初始化组件()
Me.SplitContainer1=新的System.Windows.Forms.SplitContainer()
Me.SplitContainer2=新的System.Windows.Forms.SplitContainer()
Me.ListBox1=New System.Windows.Forms.ListBox()
Me.ListBox2=New System.Windows.Forms.ListBox()
CType(Me.SplitContainer1,System.ComponentModel.ISupportInitialize.BeginInit())
Me.SplitContainer1.Panel1.SuspendLayout()
Me.SplitContainer1.Panel2.SuspendLayout()
Me.SplitContainer1.SuspendLayout()
CType(Me.SplitContainer2,System.ComponentModel.ISupportInitialize.BeginInit())
Me.SplitContainer2.Panel1.SuspendLayout()
Me.SplitContainer2.SuspendLayout()
Me.SuspendLayout()
'
'拆分容器1
'
Me.SplitContainer1.DataBindings.Add(新的System.Windows.Forms.Binding(“SplitterDistance”,Global.WindowsApplication1.My.MySettings.Default,“mainDist”,True,System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged))
Me.SplitContainer1.Dock=System.Windows.Forms.DockStyle.Fill
Me.SplitContainer1.Location=新系统.图纸.点(0,0)
Me.SplitContainer1.Name=“SplitContainer1”
'
'拆分容器1.Panel1
'
Me.SplitContainer1.Panel1.Controls.Add(Me.SplitContainer2)
'
'拆分容器1.2
'
Me.SplitContainer1.Panel2.Controls.Add(Me.ListBox2)
Me.SplitContainer1.Size=新系统.图纸.尺寸(730413)
Me.SplitContainer1.SplitterDistance=Global.WindowsApplication1.My.MySettings.Default.mainDist
Me.SplitContainer1.TabIndex=0
'
'拆分容器2
'
Me.SplitContainer2.DataBindings.Add(新的System.Windows.Forms.Binding(“SplitterDistance”,Global.WindowsApplication1.My.MySettings.Default,“sideDist”,True,System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged))
Me.SplitContainer2.Dock=System.Windows.Forms.DockStyle.Fill
Me.SplitContainer2.Location=新系统.图纸.点(0,0)
Me.SplitContainer2.Name=“SplitContainer2”
Me.SplitContainer2.Orientation=System.Windows.Forms.Orientation.Horizontal
'
'拆分容器2.1
'
Me.SplitContainer2.Panel1.Controls.Add(Me.ListBox1)
Me.SplitContainer2.Size=新系统.图纸.尺寸(310413)
Me.SplitContainer2.SplitterDistance=Global.WindowsApplication1.My.MySettings.Default.sideDist
Me.SplitContainer2.TabIndex=0
'
'列表框1
'
Me.ListBox1.Dock=System.Windows.Forms.DockStyle.Fill
Me.ListBox1.FormattingEnabled=True
Me.ListBox1.Location=新系统.图纸.点(0,0)
Me.ListBox1.Name=“ListBox1”
Me.ListBox1.Size=新系统.图纸.尺寸(310,49)
Me.ListBox1.TabIndex=0
'
'列表框2
'
Me.ListBox2.Dock=System.Windows.Forms.DockStyle.Fill
Me.ListBox2.FormattingEnabled=True
Me.ListBox2.Location=新系统.绘图.点(0,0)
Me.ListBox2.Name=“ListBox2”
Me.ListBox2.Size=新系统.图纸.尺寸(416413)
Me.ListBox2.TabIndex=0
'
“表格1
'
Me.AutoScaleDimensions=新系统.Drawing.SizeF(6.0!13.0!)
Me.AutoScaleMode=System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize=新系统.Drawing.Size(730413)
Me.Controls.Add(Me.SplitContainer1)
Me.Name=“Form1”
Me.Text=“Form1”
Me.SplitContainer1.Panel1.ResumeLayout(假)
Me.SplitContainer1.Panel2.ResumeLayout(假)
CType(Me.SplitContainer1,System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainer1.ResumeLayout(False)
Me.SplitContainer2.Panel1.ResumeLayout(假)
CType(Me.SplitContainer2,System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainer2.ResumeLayout(False)
''' <summary>
''' Sets the mainDist application setting to the new SplitterDistance
''' </summary>
''' <remarks>http://stackoverflow.com/users/2659234/brandon-b</remarks>
Private Sub SplitContainer1_SplitterMoved(sender As SplitContainer, e As SplitterEventArgs) Handles SplitContainer1.SplitterMoved
    Global.WindowsApplication1.My.MySettings.Default.mainDist = sender.SplitterDistance
End Sub

''' <summary>
''' Sets the sideDist application setting to the new SplitterDistance
''' </summary>
''' <remarks>http://stackoverflow.com/users/2659234/brandon-b</remarks>
Private Sub SplitContainer2_SplitterMoved(sender As SplitContainer, e As SplitterEventArgs) Handles SplitContainer2.SplitterMoved
    Global.WindowsApplication1.My.MySettings.Default.sideDist = sender.SplitterDistance
End Sub
Properties.Settings.Default.VertSplitterDistance = (decimal)VertSplitContainer.SplitterDistance / (decimal)VertSplitContainer.Width;
Properties.Settings.Default.Save();
VertSplitContainer.SplitterDistance = (int)Math.Round(Properties.Settings.Default.HorizontalSplitterDistance * HorizontalSplitContainer.Height, 0);