我已经四处寻找并找到了一些例如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继承,除了我不知道在此之后该做什么= =。 感谢。
答案 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。仍然在玩它,但希望这是答案,到目前为止似乎工作:)。