Vb.net 属性绑定到设置时出现奇怪的拆分容器行为
我有一个WinForms应用程序,它包含两个拆分容器。第一个SplitContainer跨越整个表单,其方向是水平的。第二个拆分容器位于第一个拆分容器的左面板内,且其方向垂直。我将每个拆分容器的SplitterDistance属性与应用程序设置绑定,以便在用户退出程序时保存位置。然而,这导致了奇怪的问题。如果我拖动主拆分容器的位置,然后拖动第二个拆分容器的位置,则第一个拆分容器将跳回原始位置,并且该位置不会保存。如果我移除第二个拆分容器,一切正常。如果SplitterDistance属性没有绑定,我也看不到这个问题 有人知道这是什么原因吗?或者我如何修复它 更新 我还发现,如果从第二个拆分容器中删除属性绑定,一切都会正常工作。即使我手动尝试实现此功能(即,删除属性绑定并在SplitContainer2.SplitterMoved事件中添加My.Settings.sideDist=SplitContainer2.SplitterDistance),问题仍然存在 我正在使用vb.net 设计器生成的代码:Vb.net 属性绑定到设置时出现奇怪的拆分容器行为,vb.net,winforms,splitcontainer,Vb.net,Winforms,Splitcontainer,我有一个WinForms应用程序,它包含两个拆分容器。第一个SplitContainer跨越整个表单,其方向是水平的。第二个拆分容器位于第一个拆分容器的左面板内,且其方向垂直。我将每个拆分容器的SplitterDistance属性与应用程序设置绑定,以便在用户退出程序时保存位置。然而,这导致了奇怪的问题。如果我拖动主拆分容器的位置,然后拖动第二个拆分容器的位置,则第一个拆分容器将跳回原始位置,并且该位置不会保存。如果我移除第二个拆分容器,一切正常。如果SplitterDistance属性没有绑定
<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);