如何将 "Click Event" 添加到 class?在 C#

How to add a "Click Event" to a class? in C#

这就是我的进展。 (我知道的不多)但我有这样的事情: 一个叫做 "SplashScreen"

的 class
private DynamicButton dynButton;

public override void Init(ContentManager Content)
    {
        base.Init(Content);

        dynButton = new DynamicButton("Test", new Vector2(450, 100), Color.White);} 

private void Dyn_Click(object sender, EventArgs e)
    {
        dynButton.ObjColor = Color.DarkOrange; //I want to do stuff here
    }

public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
        dynButton.Update(gameTime);
        dynButton.Click += Dyn_Click;
    }

并且在我的动态按钮class中如下:

   public event EventHandler Click;

   public override void Update(GameTime gameTime)
    {
        base.Update(gameTime);
        this.Click += DynamicButton_Click;
    }

    private void DynamicButton_Click(object sender, EventArgs e)
    {

    }

我真的不知道如何正确设置 Click 事件。所以就像我必须用我的鼠标检查对象的边界,这就是我所知道的,但我怎样才能使事件触发。我只想像 dynButton.Click += myMethod 这样调用,在这种方法中我会做一些事情。希望你明白我的意思。(我很新)

Xna 和 Monogame 在正常情况下(基于设备)每秒调用 Update 方法 30 到 60 次。

这意味着,如果你想使用事件;在方法本身上订阅它们是一个非常糟糕的主意,因为您每次都会获得新的订阅。在您发布的代码中,您每秒订阅该事件 60 次!

public event EventHandler Click;

public override void Update(GameTime gameTime)
{
    base.Update(gameTime);
    this.Click += DynamicButton_Click; // Called 60 times per frame on a PC!
}

我并不是说您不应该订阅这种方法,您可以,但要基于条件。永远不要随便做。

也就是说,您想要的是在安全的地方订阅事件,然后在满足条件时触发它。在您的场景中,订阅将在初始屏幕上进行:

public override void Init(ContentManager Content)
{
    base.Init(Content);

    dynButton = new DynamicButton("Test", new Vector2(450, 100), Color.White);
    dynButton.Click += SomeoneClicked;
} 

private void SomeoneClicked(object sender, EventArgs e)
{
    // Your code here.
}

动态按钮负责触发事件(但不响应事件本身)。

public event EventHandler Click;

public override void Update(GameTime gameTime)
{
    base.Update(gameTime);
    if(this.Click != null)
        Click(null, null);
}

您可以在 MSDN 上找到有关 EventHandler 的更多信息。 最后一点,我认为这是您面临的最大问题;您需要确切知道何时触发事件。根据您的评论,您需要根据鼠标的位置检查特定条件,这很容易通过 MouseState provided methods:

MouseState ms = Mouse.GetState();
var positionX = ms.X;
var positionY = ms.Y;