尝试引发事件 c#



我一直在研究许多其他关于这个问题的答案和例子,我只是对如何设置它越来越困惑。我需要根据表单类中 performMove 方法的结果在机器人类中引发一个事件。我知道我不能从另一个班级提出事件,所以我所拥有的显然是行不通的。但我真的不明白如何正确设置它。我已经阅读了有关codeProject,dreamInCode和本网站等的代表和活动文章。这是针对初学者 c# 课程的,我对此很陌生,因为我相信每个人都能看出:)

namespace Assignment12
{
    public delegate void ErrorHandler();
public partial class frmRobot : Form
{
    Robot moveRobot = new Robot();
    public frmRobot()
    {
        InitializeComponent();
        reset_Position();
        current_Position_Display();
        moveRobot.outOfRange += new ErrorHandler(moveRobot.coor_Within_Range);
    }
    ...
    private void performMove()
    {
        Point loc = lblArrow.Location;
        int x = moveRobot.Move_Robot_XAxis(loc.X);
        int y = moveRobot.Move_Robot_YAxis(loc.Y);
        if (x < -100 && x > 100)
        {
            moveRobot.outOfRange();
            x = loc.X;
        }
        if (y < -100 && y > 100)
        {
            moveRobot.outOfRange();
            y = loc.Y;
        }
        this.lblArrow.Location = new Point(x, y);
        current_Position_Display();
    }
class Robot
{
    public event ErrorHandler outOfRange;
    ...
    public void coor_Within_Range()
    {
        System.Console.WriteLine("TestOK");
    }
}

这个问题很混乱。

你应该问自己的问题是:谁负责宣布和执行政策?您有两个实体:"表单"和"机器人"。您有一些关于机器人的法律地位的政策。哪个班级负责制定该政策?机器人是否知道何时超出范围,并告知该事实的形式? 或者表单是否知道机器人何时超出范围,并通知机器人这一事实?

希望得到通知的是事件侦听器希望通知其他人违反策略的内容是事件。完全不清楚你想成为听众中的哪一个,你想成为哪一个的来源。但是你违反的规则很清楚:事件侦听器不是允许在事件发生时说的话音乐会的人不会站起来向钢琴家大喊要按什么键!这是钢琴家的决定,听众只能决定是否听,以及如何反应。

如果表单决定机器人何时超出范围,那么机器人需要成为倾听者。如果机器人决定表单何时超出范围,那么表单需要成为听众。现在你已经有了听众的形式,但它试图告诉机器人什么时候超出范围。

你似乎不需要事件。现在,这只是一种复杂的moveRobot.coor_Within_Range()调用方式。去掉中间人:

    if (x < -100 && x > 100)
    {
        moveRobot.coor_Within_Range();
        x = loc.X;
    }

尽管Within_Range和OutOfRange是奇怪的相反名称。

您需要一个事件来通知表单有关机器人中发生的事情。我在这里发布了一个关于如何做到这一点的答案。

您的coor_Within_Range需要引发事件:

public void coor_Within_Range()
{
    System.Console.WriteLine("TestOK");
    if (this.outOfRange != null) {
        this.outOfRange();
    }
}

然后在Form类中,您需要处理事件:

public frmRobot()
{
    // snipped
    moveRobot.outOfRange += new ErrorHandler(this.oncoor_Within_Range);
}
public void oncoor_Within_Range() {
    Console.WriteLine("robot within range");
}

相关内容

  • 没有找到相关文章