需要ClickEvent中的WPF数量的rectangle-array-element

时间:2016-02-15 17:40:33

标签: c# wpf events canvas rectangles

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

$rectangle = $Canvas->create_rectangle( $x1, $y1 ,$x2 ,oy2 , -outline => "red", -fill => "red");
$Canvas->bind($rectangle, "<1>", 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]);
        }
    }

XAML:

<Window x:Class="WpfRectangleEvent.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfRectangleEvent"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525"
    Loaded="Window_Loaded">

<Grid>
    <Canvas HorizontalAlignment="Left" Height="666" Margin="-17,-20,0,0"
    VerticalAlignment="Top" Width="517"
    Name="Canvas1" Grid.ColumnSpan="2">

    </Canvas>

</Grid>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

OK!知道了,这很有效:

    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]);
        }
    }