【问题标题】:Positioning UserControl relative to Form or Screen相对于窗体或屏幕定位 UserControl
【发布时间】:2014-09-19 12:53:12
【问题描述】:

有什么方法可以获取和设置UserControl 的.Location,它位于相对于“最亲”表单的Container(例如Panel)上?

我知道有可能计算Panel本身的偏移量并将其添加到UserControl的.Location中。

但在我的情况下,父级的数量是未知的,并且可能因情况而异。 因此,一旦UserControl 可以放置在直接位于Form 上的Panel 上。但也有可能将UserControl 放在第二个Panel 上,也就是在Form 上的第一个Panel。

【问题讨论】:

    标签: vb.net winforms user-controls location


    【解决方案1】:

    如果您按照自己的想法计算 Panel 的偏移量并将偏移量递归计算回 Form 会怎样?即我在 Panel1 中的 Panel2 中有一个 Textbox1。 Panel1 位于 .Left 266,Panel2 位于 Panel1 内的 .Left 77。

    Private Function GetLeftOffset(ByVal UserControl As Control) As Int32
        Dim intLeftOffset As Int32 = 0
        If Not TypeOf UserControl.Parent Is Form Then
            intLeftOffset = UserControl.Parent.Left
            intLeftOffset += GetLeftOffset(UserControl.Parent)
        End If
        Return intLeftOffset
    End Function
    

    现在如果我 GetLeftOffset(Me.TextBox1),它会返回 343 (266 + 77) 的偏移量。

    【讨论】:

    • 我发现这是最有用的。还要注意父母的填充。
    【解决方案2】:

    我使用此功能将上下文菜单放置在文本框或按钮等控件附近。您可以将 x 和 y 设置为零以返回控件本身的位置。

    '--- Return the screen location of a control with an offset
    
    Private Function Offset(ByRef controlObj As Control, ByVal x As Integer, ByVal y As Integer) As Point
    
      Dim pt As Point
      Dim parentObj As Control = controlObj.Parent
    
      Do While parentObj IsNot controlObj.FindForm
        x += parentObj.Location.X
        y += parentObj.Location.Y
        parentObj = parentObj.Parent
      Loop
    
      pt = PointToScreen(controlObj.Location)
      pt.Offset(x, y)
      Return pt
    
    End Function
    

    【讨论】:

      【解决方案3】:

      试试:

      Dim pnt As Point
      
      pnt = UserControl.PointToScreen(New Point(0, 0))
      pnt = Me.PointToClient(pnt)
      

      这会计算相对于您的表单的位置。如果您愿意,可以将 Me 更改为任何控件

      现在,如果您想设置位置,例如 (100, 100),相对于您的 Form

      pnt = Me.PointToScreen(New Point(100, 100))
      pnt = UserControl.Parent.PointToClient(pnt)
      UserControl.Location = pnt
      

      请记住,如果新位置在父区域之外,则控件将不可见。

      【讨论】:

      • 您知道哪种解决方案在性能方面更好,是您的还是 Capellan 的?
      • @mookey 如果你同时调用了几次,没有明显的区别。但是,如果您一秒钟内多次调用它们,那可能是我的,因为我使用的是本机功能。您必须对其进行测试才能确定。
      猜你喜欢
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多