2009-06-23 17 views
11

का चयन करें मैं एक साधारण सूची बॉक्स बनाना चाहता हूं और एक संदर्भ मेनू आइटम के रूप में SelectAll चुनना चाहता हूं। हालांकि ऐसा लगता है कि लिस्टबॉक्स में सिलेक्टएल के लिए कुछ प्रकार का इनबिल्ट हैंडलिंग है जो मैं काम नहीं कर सकता, लेकिन SelectAll को लागू करने के अपने प्रयास में हस्तक्षेप कर रहा हूं।WPF सूची बॉक्स और सभी

मेरा पूरा XAML यह है:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <Window.CommandBindings> 
     <CommandBinding Command="ApplicationCommands.SelectAll" 
         Executed="SelectAllExecuted" /> 
    </Window.CommandBindings> 
    <DockPanel> 
     <CheckBox DockPanel.Dock="Top">My Checkbox</CheckBox> 
     <ListBox Name="listBox" SelectionMode="Multiple"> 
      <ListBox.ContextMenu> 
       <ContextMenu> 
        <MenuItem Command="ApplicationCommands.SelectAll" /> 
       </ContextMenu> 
      </ListBox.ContextMenu> 
     </ListBox>     
    </DockPanel> 
</Window> 

SelectAllExecuted बस है यह:

private void SelectAllExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    listBox.SelectAll(); 
} 

नियंत्रण + एक काम करता है लिस्टबॉक्स ध्यान में नहीं है। संदर्भ मेनू आइटम सही ढंग से काम करता है। लेकिन अगर सूचीबॉक्स केंद्रित है तो नियंत्रण + ए काम करने से इंकार कर देता है।

मुझे लगता है कि मैं सूची बॉक्स के खिलाफ लड़ रहा हूं, लेकिन मुझे इसकी आवश्यकता नहीं है।

संपादित करें: ऐसा लगता है कि मेरी पूरी समस्याएं एकाधिक चयन मोड के साथ हैं। अगर मैं इसे विस्तारित करने के लिए सेट करता हूं तो सब कुछ काम करता है, हालांकि मैं इसे विस्तारित मोड में नहीं चाहता हूं।

उत्तर

17

लिस्टबॉक्स में Ctrl + A कुंजी संयोजन, as Marco Zhou explains के लिए यह आंतरिक आंतरिक आदेश है। हम निष्पादन और पूर्वावलोकन निष्पादन हैंडलर में ब्रेकपॉइंट लगाने का प्रयास करके इसका परीक्षण भी कर सकते हैं। जैसा कि आप देखेंगे कि न तो तब तक पहुंचा है जब ListBox पर ध्यान केंद्रित किया गया है और कुंजी संयोजन दबाया गया है। यहां तक ​​कि जब हम SelectionMode को विस्तारित करने के लिए सेट करते हैं और हम आइटम को तब भी देख सकते हैं जब हैंडलर अभी तक नहीं पहुंचते हैं। शुक्र है, हालांकि, हम एक मौजूदा इनपुट जेस्चर को फिर से असाइन करके इसे ओवरराइड कर सकते हैं। हम इसे कस्टम कस्टम Ctrl + एक हैंडलिंग से छुटकारा पाने के लिए ListBox में कर सकते हैं, और इसे ApplicationCommands.SelectAll कमांड को फिर से असाइन कर सकते हैं।

<ListBox Name="listBox" 
     SelectionMode="Multiple"> 
    <ListBox.InputBindings> 
     <KeyBinding Command="ApplicationCommands.SelectAll" 
        Modifiers="Ctrl" 
        Key="A" /> 
    </ListBox.InputBindings>    
    ... 
</ListBox> 

एक बार की बाइंडिंग ListBox में जोड़ा जाता है, यह ध्यान दिया गया है, जब यह होगा अब मार्ग Ctrl + A वापस अपने मौजूदा SelectAll कमान और SelectAllExecuted करने के लिए।

1

मेरे जैसे जो लोग कोड-पीछे :) में सब कुछ कर हवा के लिए ...

listBox.InputBindings.Add(new KeyBinding(ApplicationCommands.SelectAll, 
          new KeyGesture(Key.A, ModifierKeys.Control))); 
listBox.CommandBindings.Add(new CommandBinding(ApplicationCommands.SelectAll, (_sender, _e) => 
{ 
    listBox.SelectAll(); 
})); 
+0

सही काम के पीछे XAML ऊपर मेरा काम नहीं किया लेकिन कोड के मामले में। धन्यवाद –

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