2009-05-04 10 views
41

मेरे पास ListBox है जो मेरी wpf विंडो में ObervableCollection से जुड़ा हुआ है। यदि कोई ListBox (बस एक लिंक की तरह) के तत्व पर क्लिक करता है तो मैं ब्राउज़र खोलना चाहता हूं। क्या कोई मुझे बता सकता है कि इसे कैसे करें? मुझे listboxviews के साथ कुछ मिला, क्या यह केवल इस तरह से काम करता है या ListBox का उपयोग करके कोई तरीका है?ब्राउज़र को खोलने के लिए एक सूची बॉक्स आइटम पर डबल क्लिक करें

तुम्हारा

सेबस्टियन

उत्तर

81

आप ListBox.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 के लिए सही हस्ताक्षर के साथ पीछे अपने कोड में एक विधि है।

+1

धन्यवाद। यह मेरी समस्या भी हल करता है। एक फॉलोअप: यह चल रहे एप्लिकेशन में बहुत अच्छा काम करता है, लेकिन यह दृश्य स्टूडियो डिजाइनर (शोस्टॉपर नहीं, बल्कि एक जलन) को खो देता है। मैं एप्लिकेशन संसाधनों में ListBoxItem शैली को स्पष्ट रूप से परिभाषित नहीं करता हूं, इसलिए आधारित समय डिज़ाइन समय पर विफल हो जाएगा। हालांकि, मेरे पास एक थीमिंग लाइब्रेरी (WPFTheme) है जो इस संसाधन को रनटाइम पर परिभाषित करती है। यदि मैं एक स्थिर संसाधन को परिभाषित करता हूं, तो यह गतिशील, थीम वाले एक को समाप्त करता है। किसी भी विचार पर मैं कैसे दोनों को एक साथ अच्छा खेल सकता हूं? – el2iot2

+1

थोड़ा और प्रयोग करने के बाद, मैंने इसे समझ लिया ... मैंने बस मर्ज किए गए संसाधन में थीम के xaml का संदर्भ दिया: el2iot2

+0

यह बहुत अच्छा है लेकिन क्या होगा यदि आपने पहले से ही ResourceDictionary में ItemContainerStyle को परिभाषित किया है? – Oliver

10

मैं सूची को संभालने की आवश्यकता के बिना इसे हल करना चाहता था, कोड कोड के पीछे बॉक्स क्लिक करें, और मैं सूचीबॉक्स ओवरम शैली को ओवरराइड नहीं करना चाहता था (या शैली को पहले स्थान पर ओवरराइड करने के लिए परिभाषित करना चाहता हूं)। जब सूची बॉक्स को डबलक्लिक किया गया था तो मैं सिर्फ एक आदेश को आग लगाना चाहता था।

मैं एक संलग्न संपत्ति बनाई तरह तो (कोड बहुत विशिष्ट है, लेकिन आप इसे सामान्यीकरण कर सकते हैं के रूप में आवश्यक):

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 घोषित करने और मेरी लक्ष्य कमांड:

<ListBox ItemsSource="{Binding SomeItems}" 
    myStuff:ControlItemDoubleClick.ItemsDoubleClick="true"> 
<ListBox.InputBindings> 
    <MouseBinding MouseAction="LeftDoubleClick" Command="MyCommand"/> 
</ListBox.InputBindings> 
</ListBox> 

उम्मीद है कि इससे मदद मिलती है।

+0

लेकिन अगर वे स्क्रॉल बार पर डबल क्लिक करते हैं तो वह आग नहीं होगी? या ListBoxItems के बीच कोई पैडिंग? –

+0

हां, यदि आप सूची बॉक्स में कहीं भी डबल क्लिक करते हैं तो यह आग लग जाएगा। अभी भी मेरे लिए यह एक अच्छा समाधान है, मुझे यह पसंद है कि यह कोड पीछे नहीं लेता है। b.Command.CanExecute (null) के लिए कमांड पैरामीटर बदल दिया और शून्य से b.CommandParameter तक निष्पादित (शून्य) निष्पादित करें। – HeWillem

4

मैं अभिव्यक्ति एसडीके 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> 

Jaimir जी प्रयुक्त

+0

यदि यह सूची बॉक्स से जुड़ा हुआ है, तो यदि आप सूची सूची के किसी भी हिस्से को डबल क्लिक करते हैं, तो स्क्रॉल बार सहित लंबी सूची के साथ परेशान होने पर यह आग लग जाएगा। और listboxitem में MouseDoubleClick ईवेंट प्रतीत नहीं होता है। – Sinaesthetic

6

मैं फायरिंग आदेश को क्रियान्वित करने के साथ इस मुद्दे को हल करने के एंड्रयूज समाधान अद्यतन किया है सूची बॉक्स में कहीं भी डबल क्लिक करें:

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 के लिए घोषणा है:

<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> 
+0

धन्यवाद, यह मेरे लिए ठीक काम करता है। –

+1

यहां पर सबसे अच्छा जवाब! – JokerMartini

+1

यह समाधान था जिसे मैंने कुछ विकल्पों को आजमाने के बाद स्वतंत्र रूप से चुना था, लेकिन मैंने थोड़ा बाध्यकारी बदल दिया: मैंने 'UserControl' को 'नाम' दिया, 'सापेक्ष स्रोत' खोज हटा दी, और इसके साथ 'एलिमेंटनाम' जोड़ा जिस नाम पर मैंने नियंत्रण दिया था। नतीजा वही है, लेकिन यह उन लोगों के लिए कुछ जगह/रनटाइम बचा सकता है जिनके नियंत्रण में बहुत सारे संदर्भ हैं। – Dan

संबंधित मुद्दे