c#wpf将click事件添加到自定义类

时间:2015-02-27 02:37:07

标签: c# wpf class events click

我已经四处寻找并找到了一些例如Giving classes click events的东西,但它似乎不适用于我想要做的事情,或者我可能误解了如何去做。我想要做的是将一个click事件添加到一个名为BaseShapes的类中,当用户单击BaseShapes中的Polygon时,它将执行click事件。我对baseShapes的一些代码如下

abstract class BaseShape
{
    public Polygon shape { get; protected set; }
    public event MouseButtonEventHandler MouseDown;

    protected virtual void OnMouseDown(MouseButtonEventArgs e)
    {
        if (MouseDown != null)
        {
            MouseDown(this, e);
        }
    }
}

我只包括相关部分,有更多的变量和方法。

在我的主窗口中,我添加了

s.MouseDown += test;

其中s是BaseShape的一个实例,当然还有另一个继承自baseShape的类。测试只是将测试消息打印给用户。我知道我遗失了一些东西,因为我似乎没有测试用户是否点击了这个形状,但我不确定在此之后还有什么可做。

我之所以要这样做而不是仅仅做s.shape.MouseDown + = test;是因为我有一个方法,我想在用户点击形状时调用。我正在考虑从UIElements继承,除了我不知道在此之后该做什么= =。 感谢。

1 个答案:

答案 0 :(得分:0)

确定。我再试一次,过了一会儿,我相信我有办法做到这一点。我认为自定义事件可能不是我应该采用的方式,所以我的BaseShape继承了UIElements,我使用UIElelements的OnRender通过将Polygon更改为Geometry并使用DrawingContext参数绘制我的形状形状。

然后,我可以将这个形状本身画在我的窗口上而不是做这样的事情:

canvas.Children.Add(s.shape);

我现在可以做的是:

canvas.Children.Add(s);
你可能想知道为什么?那么现在我不需要任何自定义事件,因为UIElements带有我需要的所有事件,主要是点击事件。我只需要添加订阅者。这也允许我使用我的类中的属性,而不必在单击时从Polygon创建一个新的BaseShape。

我还需要包含这些行来在我的BaseShape类的构造函数中绘制形状

shape.Measure(new Size(length, length));
shape.Arrange(new Rect(0, 0, length, length));

如果不是,则不会绘制形状。

如果您想知道我的最终代码是什么样的,基本上就是这样,只包括重要部分:

abstract class BaseShape : UIElement
{
    public Polygon shape { get; protected set; }

    public BaseShape()
    {
        shape.Measure(new Size(length, length));
        shape.Arrange(new Rect(0, 0, length, length));
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        Geometry s = shape.RenderedGeometry;
        drawingContext.DrawGeometry(Brushes.Red, new Pen(Brushes.Black, 1), s);

        //base.OnRender(drawingContext);
    }
}

public partial class MainWindow : Window
{
    Shapes.Square sq;

    public MainWindow()
    {
        InitializeComponent();

        sq = new Shapes.Square(50, 0, 0, 0, 0, 2, Brushes.Red, Brushes.Black, Brushes.Red, Brushes.Purple);

        canvas.Children.Add(sq);
        sq.MouseDown += test;
    }

    public void test(Object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("Testing if this works :D");
    }
}

}

希望我没有错过我改变的一行代码。我不需要课堂上的任何活动,只需要继承UIElements。仍然在玩它,但希望这是答案,到目前为止似乎工作:)。