Есть ли способ ответить на двойной щелчок на ListBoxItem в WPF?
У меня есть простое приложение WPF с ListBox элементов. Для простоты этого примера я составил список строк, но на самом деле это будет список некоторого сложного типа. Если дважды щелкнуть сам элемент в списке, я хочу ответить на него. По-видимому, в ListBox нет события двойного прямого щелчка для самого элемента. Есть ли простой способ ответить на элемент в ListBox, по которому дважды щелкают (не сам список)?
Вот мой xaml:
<Window x:Class="WpfApplication12.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox>
<ListBox.Items>
<sys:String>Item1</sys:String>
<sys:String>Item2</sys:String>
<sys:String>Item3</sys:String>
<sys:String>Item4</sys:String>
<sys:String>Item5</sys:String>
</ListBox.Items>
</ListBox>
</Grid>
</Window>
1 ответ
Решение
Это может быть легко достигнуто путем создания ItemContainerStyle и добавления EventSetter.
Измените свой XAML следующим образом:
<Window x:Class="WpfApplication12.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
<EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_DoubleClick" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.Items>
<sys:String>Item1</sys:String>
<sys:String>Item2</sys:String>
<sys:String>Item3</sys:String>
<sys:String>Item4</sys:String>
<sys:String>Item5</sys:String>
</ListBox.Items>
</ListBox>
</Grid>
</Window>
Код позади:
namespace WpfApplication12
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void ListBoxItem_DoubleClick(object sender, MouseButtonEventArgs e)
{
var listBoxItem = sender as ListBoxItem;
if (listBoxItem != null)
{
var content = listBoxItem.Content as string;
MessageBox.Show(content);
}
}
}
}
Вот ссылка на страницу MSDN, которая немного объясняет EventSetters: http://msdn.microsoft.com/en-us/library/system.windows.eventsetter.aspx