Дважды щелкните элемент списка, чтобы открыть браузер
У меня есть ListBox
в моем окне wpf, которое привязывается к ObervableCollection
. Я хочу открыть браузер, если кто-то нажимает на элемент ListBox
(так же, как ссылка). Может кто-нибудь сказать мне, как это сделать? Я нашел что-то с listboxviews, это работает только так или есть способ, просто используя ListBox
?
Твое
Себастьян
4 ответа:
Вы можете добавить стиль в Список .ItemContainerStyle , и добавьте EventSetter туда:
<ListBox> .... <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}"> <EventSetter Event="MouseDoubleClick" Handler="ListBoxItem_MouseDoubleClick"/> </Style> </ListBox.ItemContainerStyle> </ListBox>
ListBoxItem_MouseDoubleClick-это метод в вашем коде с правильной подписью дляMouseDoubleClick .
Я хотел решить эту проблему без необходимости обрабатывать событие двойного щелчка listBoxItem в коде, и я не хотел переопределять стиль listBoxItem (или определять стиль для переопределения в первую очередь). Я хотел просто запустить команду, когда список был дважды выбран.
Я создал вложенное свойство типа so (код очень специфичен, но вы можете обобщить его по мере необходимости):
public class ControlItemDoubleClick : DependencyObject { public ControlItemDoubleClick() { } public static readonly DependencyProperty ItemsDoubleClickProperty = DependencyProperty.RegisterAttached("ItemsDoubleClick", typeof(bool), typeof(Binding)); public static void SetItemsDoubleClick(ItemsControl element, bool value) { element.SetValue(ItemsDoubleClickProperty, value); if (value) { element.PreviewMouseDoubleClick += new MouseButtonEventHandler(element_PreviewMouseDoubleClick); } } static void element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { ItemsControl control = sender as ItemsControl; foreach (InputBinding b in control.InputBindings) { if (!(b is MouseBinding)) { continue; } if (b.Gesture != null && b.Gesture is MouseGesture && ((MouseGesture)b.Gesture).MouseAction == MouseAction.LeftDoubleClick && b.Command.CanExecute(null)) { b.Command.Execute(null); e.Handled = true; } } } public static bool GetItemsDoubleClick(ItemsControl element) { return (bool)element.GetValue(ItemsDoubleClickProperty); }
}
Затем я объявляю свой список с вложенным свойством и моя целевая команда:
<ListBox ItemsSource="{Binding SomeItems}" myStuff:ControlItemDoubleClick.ItemsDoubleClick="true"> <ListBox.InputBindings> <MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/> </ListBox.InputBindings> </ListBox>
Надеюсь, это поможет.
Я обновил решение Эндрюса, чтобы решить проблему с запуском выполнения команды, если дважды щелкнуть в любом месте списка:
public class ControlDoubleClick : DependencyObject { public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(ControlDoubleClick), new PropertyMetadata(OnChangedCommand)); public static ICommand GetCommand(Control target) { return (ICommand)target.GetValue(CommandProperty); } public static void SetCommand(Control target, ICommand value) { target.SetValue(CommandProperty, value); } private static void OnChangedCommand(DependencyObject d, DependencyPropertyChangedEventArgs e) { Control control = d as Control; control.PreviewMouseDoubleClick += new MouseButtonEventHandler(Element_PreviewMouseDoubleClick); } private static void Element_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) { Control control = sender as Control; ICommand command = GetCommand(control); if (command.CanExecute(null)) { command.Execute(null); e.Handled = true; } } }
И в XAML объявление для списка выглядит следующим образом:
<ListBox ItemsSource="{Binding MyItemsSource, Mode=OneWay}"> <ListBox.ItemContainerStyle> <Style> <Setter Property="behaviours:ControlDoubleClick.Command" Value="{Binding DataContext.MyCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/> </Style> </ListBox.ItemContainerStyle> </ListBox>
Я использовал выражение SDK 4.0
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" <i:Interaction.Triggers> <i:EventTrigger EventName="MouseDoubleClick" SourceName="CaravanasListBox"> <i:InvokeCommandAction Command="{Binding AccionesToolbarCommand}" CommandParameter="{x:Static local:OpcionesBarra.MostrarDetalle}" /> </i:EventTrigger> </i:Interaction.Triggers>
Хаймир Г.