簡體   English   中英

c#wpf將click事件添加到自定義類

[英]c# wpf add click event to custom class

我四處搜尋並發現了一些東西,例如,這是一個給類的單擊事件,但是它似乎不適用於我想做的事情,或者我可能誤會了如何做。 我想要做的是將單擊事件添加到名為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繼承,除了不知道在此之后下一步該怎么做= /。 謝謝。

好。 我再次嘗試,過了一段時間后,我相信我有辦法做到這一點。 我認為對我來說,自定義事件可能不是我應該采取的方式,因此我的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。 仍在嘗試,但希望這是答案,到目前為止,它似乎仍然有效:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM