C# 如何从自定义形状获取零件

C# 如何从自定义形状获取零件,c#,wpf,shape,C#,Wpf,Shape,我有一个定制的形状 public class Procedure : Shape { protected override System.Windows.Media.Geometry DefiningGeometry { get { GeometryGroup gg = new GeometryGroup(); gg.FillRule = FillRule.Nonzero;

我有一个定制的形状

public class Procedure : Shape
{
    protected override System.Windows.Media.Geometry DefiningGeometry
    {
        get 
        {
            GeometryGroup gg = new GeometryGroup();
            gg.FillRule = FillRule.Nonzero;
            RectangleGeometry rg = new RectangleGeometry(bound, 10, 10);
            Geometry geometry = label.BuildGeometry(new Point(innerLabelOffsetX, innerLabelOffsetY));

            gg.Children.Add(rg);
            gg.Children.Add(geometry);
            gg.Children.Add(inputPort.Geometry);
            gg.Children.Add(outputPort.Geometry);

            return gg;
        }
    }
}
其中
bound
Rect
label
FormattedText
inputPort
outputPort
是我的自定义形状

看起来像这样

我想获得有关图中单击部分的信息。 我怎么能做到

例:

  • 单击左侧圆圈显示消息“输入端口”
  • 单击右侧圆圈显示消息“输出端口”

  • 您需要执行以下几个步骤:

    0)首先,您必须定义
    委托
    ,例如在应用程序的命名空间中:

    public delegate void MouseDownHandler( object sender);
    
    1) 在自定义形状类中,必须在MouseDownHandler上定义事件。比如:

    public event MouseDownHandler MouseDownEvent;
    
    2) 在自定义形状类的构造函数中,必须填写以下字符串:

    this.MouseDown += new System.Windows.Input.MouseButtonEventHandler(CustomShape_MouseDown); 
    
    3) 然后,定义两种方法:

    private void CustomShape_MouseDown(object sender,
     System.Windows.Input.MouseButtonEventArgs e)
             {
                 OnMouseDownHandler(this);
             }
    
    private void OnMouseDownHandler(object sender)
             {
                 if (MouseDownEvent != null) { MouseDownEvent(sender); }
             }
    
    4) 你的自定义形状课程结束了。现在,让我们在UI类中编写一些代码:

    MouseDownHandler _perform_click = new MouseDownHandler(OnCustomShapeMouseDown);
    
    private void OnCustomShapeMouseDown(object sender)
                {
                    ...your actions on custom shape click event...like message "Input port" or smth
                }
    
    5) 最后一步,必须将
    \u perform\u click
    处理程序分配给shape类中的处理程序。在UI的构造方法中,例如:

    _custom_shape.MouseDownEvent += _perform_click;
    
    \u custom\u shape
    是自定义shape类的对象。您也可以在UI构造函数中创建它


    就这样。

    你是说要添加上下文菜单弹出窗口@DJKRAZE,什么意思?@DJKRAZE,不,我不想要上下文菜单。我想获得有关用户在复合形状上单击的内容的信息。您为什么不能根据曾经单击过的鼠标按钮创建事件或委托?我对误解表示歉意。谢谢您的回复。我试图执行您的指令,但在最后一步中出现了错误。在UI类(MainWindow.xaml.cs)中,我编写了
    currentShape.MouseDownEvent+=\u perform\u click和I gor错误:无法使用实例引用访问成员“System.Windows.UIElement.MousedowEvent”;使用类型名称而不是currentShape static来限定它?这种错误通常是因为它而发生的。事实上,我给你发了我的代码,对我来说,一切都必须正常…好吧,然后试着使用你的形状类名,而不是对象,或者删除静态并在我打开另一个的时候使用currentShape:试着将静态添加到OnCustomShapeMouseDown.it已编译,但不起作用。我将您的代码添加到shape端口。当我点击我的复合形状时,我在Debugger中看到发送者是程序。但我想去港口。