我將PreviewMouseLoeftButtonDown事件處理程序附加到ListBox。目標是從事件處理程序中的「e.Source」參數獲取單擊的ListBoxItem。這與下面的UI代碼工作完美:ListBox PreviewMouseLeftButtonDown DataTemplate問題
</ListBox>
<ListBox Name="listBox3">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBoxItem>
<Rectangle Height="25" Width="30">
</ListBoxItem>
</ListBox>
代碼:
listBox3.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(PreviewMouseLeftButtonDown);
private void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {}
在執行時, 「e.Source」 填充了我點擊了ListBoxItem中。這就是我想要發生的事情。
但是下面的代碼行爲不一樣。
<ListBox Name="listBox3">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"></StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<Rectangle Width="30" Height="25"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
而且
List<int> items = new List<int> {1};
listBox3.ItemsSource = items;
listBox3.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(PreviewMouseLeftButtonDown);
private void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {}
在這種情況下,ListBox中的矩形顯示OK。然而在這種情況下,「e.Source」填充了包含我單擊的項目的ListBox。這不是我想要的,我希望e.Source包含ListBoxItem我點擊了,就像我在上面附加的第一段代碼中發生的一樣。
任何想法?
有趣的是,e.OriginalSource在我發佈的第一個示例中返回一個「Border」對象,在第二個示例中返回一個「Rectangle」。從來沒有ListBoxItem。 我想這是什麼挫折我,ListBox預覽事件的MouseEventArgs值的不一致性... – Andrew 2010-07-13 14:34:07