.NET Windows 窗体自定义设计器不刷新菜单

标签 .net vb.net custom-controls windows-forms-designer

我为我的自定义控件创建了一个自定义设计器 (PannelloSfondoDesigner),即背景面板 (PannelloSfondo)。

<Designer(GetType(PannelloSfondo.PannelloSfondoDesigner))>
Public Class PannelloSfondo
    Inherits UserControl

    Friend Class PannelloSfondoDesigner
        Inherits ParentControlDesigner

        Public Overrides Sub Initialize(ByVal component As IComponent)
            MyBase.Initialize(component)

            verbDock = New DesignerVerb("Dock to parent container", New EventHandler(AddressOf Me.OnDock))
            verbUndock = New DesignerVerb("Undock from parent container", New EventHandler(AddressOf Me.OnUndock))
            verbs = New DesignerVerbCollection()

            If Me.Control.Dock = DockStyle.Fill Then
                verbs.Add(verbUndock)
            Else
                verbs.Add(verbDock)
            End If
        End Sub

        Public Overrides ReadOnly Property Verbs() As DesignerVerbCollection
            Get
                Return verbs
            End Get
        End Property

        Private Sub OnDock(ByVal sender As Object, ByVal e As EventArgs)
            'Dim verbo As DesignerVerb = DirectCast(sender, DesignerVerb)
            verbs.Clear()
            verbs.Add(verbDock)
            Me.Control.Dock = DockStyle.Fill
        End Sub

        Private Sub OnUndock(ByVal sender As Object, ByVal e As EventArgs)
            verbs.Clear()
            verbs.Add(verbUndock)
            Me.Control.Dock = DockStyle.None
        End Sub

        Public Overrides Function CanBeParentedTo(ByVal parentDesigner As IDesigner) As Boolean
            Return True
        End Function

        Private verbs As DesignerVerbCollection = Nothing
        Private verbDock As DesignerVerb
        Private verbUndock As DesignerVerb
    End Class

End Class

它有效,我单击小箭头,出现上下文菜单:

control's context menu

我单击菜单项,事件被触发,控件被停靠:

menu clicked

但菜单描述未更新或刷新(它应显示“从父容器取消停靠”)。然后,如果我单击控件外部以取消选择它,然后单击箭头以显示菜单,则会显示右侧菜单项:

right menu text displayed

如何刷新菜单项?! 谢谢。

最佳答案

你可能把动词搞混了吗?

在您的代码中,当您对其进行 Dock-Filling 时,您会清除动词,然后添加 verbDock,而不是 verbUndock。

Private Sub OnDock(ByVal sender As Object, ByVal e As EventArgs)
  'Dim verbo As DesignerVerb = DirectCast(sender, DesignerVerb)
  verbs.Clear()

  'Switch verbs:
  'verbs.Add(verbDock)
  verbs.Add(verbUndock)

  Me.Control.Dock = DockStyle.Fill
End Sub

Private Sub OnUndock(ByVal sender As Object, ByVal e As EventArgs)
  verbs.Clear()

  'Switch verbs:
  'verbs.Add(verbUndock)
  verbs.Add(verbDock)

  Me.Control.Dock = DockStyle.None
End Sub

更新:

尝试更改设计器类以不清除集合,只需切换 Verb 集合的 Visible 属性即可:

Public Overrides Sub Initialize(ByVal component As IComponent)
  MyBase.Initialize(component)

  verbDock = New DesignerVerb("Dock to parent container", New EventHandler(AddressOf Me.OnDock))
  verbUndock = New DesignerVerb("Undock from parent container", New EventHandler(AddressOf Me.OnUndock))
  verbs = New DesignerVerbCollection()
  verbs.Add(verbDock)
  verbs.Add(verbUndock)

  If Me.Control.Dock = DockStyle.Fill Then
    verbDock.Visible = False
  Else
    verbUndock.Visible = False
  End If
End Sub

Private Sub OnDock(ByVal sender As Object, ByVal e As EventArgs)
  Me.Control.Dock = DockStyle.Fill
  verbUndock.Visible = True
  verbDock.Visible = False
End Sub

Private Sub OnUndock(ByVal sender As Object, ByVal e As EventArgs)
  Me.Control.Dock = DockStyle.None
  verbDock.Visible = True
  verbUndock.Visible = False
End Sub

关于.NET Windows 窗体自定义设计器不刷新菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905255/

相关文章:

c# - WPF DataGrid 左上角选择所有标题按钮不聚焦网格

c# - 为什么我的表单例份验证票过期得这么快?

javascript - 自定义警报框不是 jquery 在哪里?

wpf - 到 ScaleTransform 的模板绑定(bind)在自定义控件中不起作用

c# - 如何在 Web 窗体的内联 if-else 语句中使用从数据绑定(bind)表达式解析的值?

c# - “Do not use Abstract Base class in Design; but in Modeling/Analysis”

asp.net - 从用户控件访问父页面属性

html - 我可以更改特定 aspx 的母版页 css 吗?

vb.net - 如何搜索字典键的一部分?

c# - 如何使用图像创建自定义工具提示?