gpt4 book ai didi

.net - 如何处理来自另一个类/实例的成员的事件

转载 作者:行者123 更新时间:2023-11-30 22:44:59 25 4
gpt4 key购买 nike

我试图在应用程序的几个不同部分之间共享一个子菜单,以使其保持一致(不想复制/粘贴。)我认为这很简单。我正在做这样的事情:

 public class MyClientClass
Private WithEvents ctx As ContextMenuManager = New ContextMenuManager
Private Sub handler() Handles ctx._myToolstripMenuItem.Click
' do something useful
End Sub
End Class

Public Class ContextMenuManager
Public WithEvents _myToolstripMenuItem As ToolStripMenuItem

Public Sub New()
Me._myToolstripMenuItem = New ToolStripMenuItem
Me._myToolstripMenuItem.Name = "DoSomehting"
Me._myToolstripMenuItem.Size = New System.Drawing.Size(48, 20)
Me._myToolstripMenuItem.Text = "Go!"
End Sub
End Class

但是该代码给我一个错误:类中的“句柄”必须指定一个“WithEvents”变量,“MyBase”、“MyClass”或“Me”用单个标识符限定。

我为容器应用程序和菜单项提供了 WithEvents 关键字。是什么赋予了?我错过了什么? C# 示例会给出相同的错误吗?

改变焦点以另一种方式解决这个问题。处理共享类中的所有事件并使用公共(public)对象触发公共(public)事件:

Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles ToolStripMenuItem.Click
' edit _legacyAttributes instance per specifics
' ...
' then always raise the same event with the updated payload object
RaiseEvent TypeChanged(_legacyAttributes)
End Sub

因此,您可以想象类中有数十个这样的处理程序,每个处理程序都根据需要修改其 _legacyAttributes...

最佳答案

“withevents”声明是一种非常好的语法糖,类似于这样:

WithEvents Foo as Control   -- becomesDim _Foo as ControlProperty Foo as Control  Get    Return _Foo  End Get  Set(Value as Control)    If _Foo IsNot Nothing Then      RemoveHandler _foo.Click,foo_Click      RemoveHandler _foo.Load,foo_Load      etc.    End If    _Foo = Value    If _Foo IsNot Nothing Then      AddHandler _foo.Click,foo_Click      AddHandler _foo.Load,foo_Load      etc.    End If  End SetEnd Property

对于与 Foo 关联的每个句柄声明,将有一个 RemoveHandler 和一个 AddHandler。请注意,此类属性声明只能在当前类中完成。一个类没有通用的方法来告诉另一个类设置它的一个属性应该导致代表前一个类订阅事件。

关于.net - 如何处理来自另一个类/实例的成员的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com