C# 需要ClickEvent中矩形数组元素的WPF编号

C# 需要ClickEvent中矩形数组元素的WPF编号,c#,wpf,events,canvas,rectangles,C#,Wpf,Events,Canvas,Rectangles,我目前正在将一个perl-tk应用程序移植到c#wpf。该应用程序为不同的系统提供了一个具有不同时间线的图形界面。时间线由矩形组成,每个矩形代表一个特殊的事件,可以点击这些矩形来获取关于该事件的更深入的信息。根据事件的长度,矩形有不同的大小,因此它们的大小(宽度)是不同的,不可预测。 我现在所需要的是将一个事件绑定到每个矩形上的可能性,至少可以让我跟踪单击的矩形。在Perl中,它非常简单: $rectangle = $Canvas->create_rectangle( $x1, $y1 ,

我目前正在将一个perl-tk应用程序移植到c#wpf。该应用程序为不同的系统提供了一个具有不同时间线的图形界面。时间线由矩形组成,每个矩形代表一个特殊的事件,可以点击这些矩形来获取关于该事件的更深入的信息。根据事件的长度,矩形有不同的大小,因此它们的大小(宽度)是不同的,不可预测。 我现在所需要的是将一个事件绑定到每个矩形上的可能性,至少可以让我跟踪单击的矩形。在Perl中,它非常简单:

$rectangle = $Canvas->create_rectangle( $x1, $y1 ,$x2 ,oy2 , -outline => "red", -fill => "red");
$Canvas->bind($rectangle, "<1>", sub {DoAction[$number]});
$rectangle=$Canvas->create_rectangle($x1,$y1,$x2,oy2,-outline=>“红色”,-fill=>“红色”);
$Canvas->bind($rectangle,“,sub{DoAction[$number]});
这意味着您可以将事件绑定放在需要单击的元素之后。 我已经浪费了整个周末去寻找一个在c#wpf中实现这一点的解决方案。。。重要的是要知道——我是c#的绝对新手。 到目前为止,我的代码是:我通过数组生成了10个矩形。我想将矩形数组的编号传递给ClickEvent。在下面的示例代码中,ClickEvent始终打印出最高索引。我假设,只有一个事件,我需要生成一个事件数组。。。?解决这个问题的办法是什么?简而言之:单击了哪个矩形(数字)

    private void ClickEvent (object sender, EventArgs e, int i) {
        var time = DateTime.Now;
        string name = ((Shape)sender).Name;
        Console.WriteLine("Rectangle click at " + time + " from " + name + " Rect. Nr." + i);
    }
    private void Window_Loaded(object sender, RoutedEventArgs e) {
        int NumObjects = 10;
        Rectangle[] RectangleArray = new Rectangle[NumObjects];

        for (int i = 0; i < NumObjects - 1; i++) {
            RectangleArray[i] = new Rectangle();
            RectangleArray[i].Width = 50;
            RectangleArray[i].Height = 50;
            RectangleArray[i].Fill = Brushes.Red;
            Canvas.SetTop(RectangleArray[i], i * 50);
            Canvas.SetLeft(RectangleArray[i], i * 50);

            RectangleArray[i].MouseLeftButtonDown += (sender2, e2) => ClickEvent(sender2, e2, i);

            Canvas1.Children.Add(RectangleArray[i]);
        }
    }
private void ClickEvent(对象发送者、事件参数e、int i){
var time=DateTime.Now;
字符串名称=((形状)发送者).name;
Console.WriteLine(“在“+name+”矩形编号“+i”中的“+time+”处单击矩形);
}
已加载私有无效窗口(对象发送器、路由目标){
int NumObjects=10;
矩形[]矩形阵列=新矩形[NumObjects];
对于(int i=0;iClickEvent(发送者2,e2,i);
Canvas1.Children.Add(矩形数组[i]);
}
}
XAML:



在事件处理程序方法中,发送方对象是调用事件的矩形。
因此,如果存储矩形,可以找到该矩形的索引。

在事件处理程序方法中,发送方对象是调用事件的矩形。
因此,如果存储矩形,您可以找到该矩形的索引。

好的!明白了,这很有效:

    private void ClickEvent(object sender, EventArgs e, int i) {
        var time = DateTime.Now;
        Console.WriteLine("Rectangle click at " + time + " from Rect. Nr." + i);
    }
    private void Window_Loaded(object sender, RoutedEventArgs e) {
        int NumObjects = 10;
        Rectangle[] RectangleArray = new Rectangle[NumObjects];

        for (int i = 0; i < NumObjects - 1; i++) {
            int index = i;
            RectangleArray[i] = new Rectangle();
            RectangleArray[i].Width = 50;
            RectangleArray[i].Height = 50;
            RectangleArray[i].Fill = Brushes.Red;
            Canvas.SetTop(RectangleArray[i], i * 50);
            Canvas.SetLeft(RectangleArray[i], i * 50);

            RectangleArray[i].MouseLeftButtonDown += (sender2, e2) => ClickEvent(sender2, e2, index);

            Canvas1.Children.Add(RectangleArray[i]);
        }
    }
private void ClickEvent(对象发送者、事件参数e、int i){
var time=DateTime.Now;
Console.WriteLine(“在矩形编号“+i”的“+time+”处单击矩形);
}
已加载私有无效窗口(对象发送器、路由目标){
int NumObjects=10;
矩形[]矩形阵列=新矩形[NumObjects];
对于(int i=0;iClickEvent(发送者2,e2,索引);
Canvas1.Children.Add(矩形数组[i]);
}
}

好的!明白了,这很有效:

    private void ClickEvent(object sender, EventArgs e, int i) {
        var time = DateTime.Now;
        Console.WriteLine("Rectangle click at " + time + " from Rect. Nr." + i);
    }
    private void Window_Loaded(object sender, RoutedEventArgs e) {
        int NumObjects = 10;
        Rectangle[] RectangleArray = new Rectangle[NumObjects];

        for (int i = 0; i < NumObjects - 1; i++) {
            int index = i;
            RectangleArray[i] = new Rectangle();
            RectangleArray[i].Width = 50;
            RectangleArray[i].Height = 50;
            RectangleArray[i].Fill = Brushes.Red;
            Canvas.SetTop(RectangleArray[i], i * 50);
            Canvas.SetLeft(RectangleArray[i], i * 50);

            RectangleArray[i].MouseLeftButtonDown += (sender2, e2) => ClickEvent(sender2, e2, index);

            Canvas1.Children.Add(RectangleArray[i]);
        }
    }
private void ClickEvent(对象发送者、事件参数e、int i){
var time=DateTime.Now;
Console.WriteLine(“在矩形编号“+i”的“+time+”处单击矩形);
}
已加载私有无效窗口(对象发送器、路由目标){
int NumObjects=10;
矩形[]矩形阵列=新矩形[NumObjects];
对于(int i=0;iClickEvent(发送者2,e2,索引);
Canvas1.Children.Add(矩形数组[i]);
}
}