如何将 "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;
这就是我的进展。 (我知道的不多)但我有这样的事情: 一个叫做 "SplashScreen"
的 classprivate 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;