2016-02-15 49 views
1

我正在將一個perl-tk應用程序移植到c#wpf。該應用程序爲不同系統提供具有不同時間線的圖形界面。時間軸由矩形組成 - 每個矩形代表一個特殊事件 - 可以通過點擊獲取有關事件的更深層信息。矩形根據事件的長度有不同的大小 - 所以它們的大小(寬度)是不同的,不可預測的。 現在我需要的是將事件綁定到每個矩形的可能性 - 至少 - 讓我追蹤哪個矩形被點擊。在Perl中,它如此簡單:在ClickEvent中需要WPF數量的矩形陣列元素

$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> 

回答

0

在事件處理程序的方法的發送器對象是調用事件的矩形。 所以如果你存儲矩形,你可以找出矩形的索引。

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