我正在將一個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>