Tôi muốn giải quyết vấn đề này mà không cần xử lý sự kiện double click listBoxItem trong mã phía sau và tôi không muốn ghi đè kiểu listBoxItem (hoặc xác định kiểu ghi đè ở vị trí đầu tiên). Tôi muốn chỉ cần bắn một lệnh khi listBox được doubleclicked.
Tôi tạo ra một tài sản gắn liền như vậy (mã là rất cụ thể, nhưng bạn có thể khái quát nó như là bắt buộc):
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);
}
}
tôi sau đó tuyên bố ListBox của tôi với các tài sản gắn liền và tôi lệnh mục tiêu:
<ListBox ItemsSource="{Binding SomeItems}"
myStuff:ControlItemDoubleClick.ItemsDoubleClick="true">
<ListBox.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/>
</ListBox.InputBindings>
</ListBox>
Hy vọng điều này sẽ hữu ích.
Cảm ơn. Điều này giải quyết vấn đề của tôi quá. Một followup: Điều này làm việc rất tốt trong ứng dụng đang chạy, nhưng nó lại thiết kế studio trực quan (không phải là một showstopper, nhưng là một kích thích). Tôi không xác định rõ ràng một kiểu ListBoxItem trong tài nguyên ứng dụng, vì vậy BaseOn sẽ thất bại trong thời gian thiết kế. Tuy nhiên, tôi có một thư viện theming (WPFTheme) định nghĩa tài nguyên này khi chạy. Nếu tôi định nghĩa một tài nguyên tĩnh, nó sẽ xóa bỏ một tài nguyên động, theo chủ đề. Bất cứ suy nghĩ nào về cách tôi có thể làm cho cả hai cùng chơi tốt đẹp? – el2iot2
Sau khi thử nghiệm nhiều hơn một chút, tôi đã tìm ra ... Tôi chỉ tham chiếu xaml của chủ đề trong thuộc tính mergedresource: –
el2iot2
khá thú vị nhưng nếu bạn đã định nghĩa ItemContainerStyle trong ResourceDictionary thì sao? – Oliver