我将PreviewMouseLoeftButtonDown事件处理程序附加到ListBox。目的是从事件处理程序中的“e.Source”参数获取单击的ListBoxItem。这与以下UI代码完美配合:
</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 ,就像我上面附带的第一段代码中发生的一样。
有什么想法吗?
答案 0 :(得分:2)
为什么不依靠Source
或OriginalSource
作为ListBoxItem
,为什么不通过样式在ListBoxItem
上设置事件?
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="PreviewMouseLeftButtonDown"/>
</Style>
</ListBox.ItemContainerStyle>
这样您就可以确保源始终是ListBoxItem。
答案 1 :(得分:0)
e.OriginalSource将给出ListboxItem