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中看到发送者是程序。但我想去港口。