2008-09-25 6 views
5

मैं Win12orms ListView के समतुल्य को View संपत्ति View.List पर सेट करने की कोशिश कर रहा हूं। दृश्यमान, निम्नलिखित ठीक काम करता है। मेरे Listbox में फ़ाइल नाम ऊपर से नीचे तक जाते हैं, और फिर एक नए कॉलम पर लपेटें।ListBox + WrapPanel तीर कुंजी नेविगेशन

<ListBox Name="thelist" 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding}" 
    ScrollViewer.VerticalScrollBarVisibility="Disabled"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <WrapPanel IsItemsHost="True" 
       Orientation="Vertical" /> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

हालांकि, डिफ़ॉल्ट तीर कुंजी नेविगेशन लपेट नहीं करता है:

यहाँ बुनियादी XAML के साथ मैं काम कर रहा हूँ है। यदि कॉलम में अंतिम आइटम चुना जाता है, तो नीचे तीर दबाकर अगले कॉलम के पहले आइटम पर नहीं जाता है।

private void thelist_KeyDown(object sender, KeyEventArgs e) { 
    if (object.ReferenceEquals(sender, thelist)) { 
     if (e.Key == Key.Down) { 
      e.Handled = true; 
      thelist.Items.MoveCurrentToNext(); 
     } 
     if (e.Key == Key.Up) { 
      e.Handled = true; 
      thelist.Items.MoveCurrentToPrevious(); 
     } 
    } 
} 

यह पैदा करता है पिछले-इन-स्तंभ के लिए फर्स्ट-इन-अगली स्तंभ व्यवहार है कि मैं चाहता था, लेकिन यह भी कुछ अजीब बाईं में पैदा करता है और:

मैं KeyDown घटना इस तरह से निपटने की कोशिश की दायां तीर हैंडलिंग। जब भी यह ऊपर/नीचे तीर का उपयोग करके एक कॉलम से अगले/पिछले तक लपेटता है, बाएं या दाएं तीर कुंजी का एक भी बाद का उपयोग चयन को उस आइटम के बाएं या दाएं स्थान पर ले जाता है जिसे लपेटने से ठीक पहले चुना गया था।

मान लें कि सूची "0101" के माध्यम से स्ट्रिंग "0001" से 10 स्ट्रिंग प्रति कॉलिंग के साथ भरती है। यदि मैं "0010" से "0011" पर जाने के लिए नीचे तीर कुंजी का उपयोग करता हूं, तो दाएं तीर कुंजी दबाएं, चयन "0020" के लिए "0020" पर जाएं। यदि "0011" चुना गया है और मैं चयन को "0010" में स्थानांतरित करने के लिए ऊपर तीर कुंजी का उपयोग करता हूं, तो दायां तीर कुंजियों का एक प्रेस "0021" (बाईं ओर "0011" के दाईं ओर, और बाईं ओर एक प्रेस पर जाता है "0001" के लिए तीर कुंजी चाल चयन।

किसी भी मदद के वांछित स्तंभ-चादर लेआउट को प्राप्त करने और तीर कुंजी नेविगेशन की सराहना की जाएगी।

(संपादित करता मेरे अपने जवाब में ले जाया गया है, क्योंकि यह तकनीकी तौर पर एक जवाब है।)

उत्तर

8

यह जब यह सही मद के लिए KeyDown घटना, चयन में परिवर्तन की मेरी हैंडलिंग में इर्द-गिर्द घूमती है कि पता चला है, लेकिन ध्यान देने के पुराने आइटम पर है।

यहां अपडेट किया गया KeyDown इवेंटहालर है। बाइंडिंग के कारण, Items संग्रह ListBoxItem एस के बजाय मेरे वास्तविक आइटम लौटाता है, इसलिए मुझे ListBoxItem प्राप्त करने के लिए अंत में एक कॉल करना है, मुझे Focus() पर कॉल करने की आवश्यकता है। पिछले आइटम से पहले और इसके विपरीत से MoveCurrentToLast() और MoveCurrentToFirst() की कॉल स्वैप करके हासिल किया जा सकता है।

private void thelist_KeyDown(object sender, KeyEventArgs e) { 
    if (object.ReferenceEquals(sender, thelist)) { 
     if (thelist.Items.Count > 0) { 
      switch (e.Key) { 
       case Key.Down: 
        if (!thelist.Items.MoveCurrentToNext()) { 
         thelist.Items.MoveCurrentToLast(); 
        } 
        break; 

       case Key.Up: 
        if (!thelist.Items.MoveCurrentToPrevious()) { 
         thelist.Items.MoveCurrentToFirst(); 
        } 
        break; 

       default: 
        return; 
      } 

      e.Handled = true; 
      ListBoxItem lbi = (ListBoxItem) thelist.ItemContainerGenerator.ContainerFromItem(thelist.SelectedItem); 
      lbi.Focus(); 
     } 
    } 
} 
+0

ग्रेट, इससे मुझे बहुत मदद मिली। ;) – Inferis

4

आपको कीबोर्ड नेविगेशन का उपयोग कर ईवेंट श्रोता के बिना ऐसा करने में सक्षम होना चाहिए। डायरेक्शनल नेविगेशन, उदा।

<ListBox Name="thelist" 
     IsSynchronizedWithCurrentItem="True" 
     ItemsSource="{Binding}" 
     ScrollViewer.VerticalScrollBarVisibility="Disabled" 
     KeyboardNavigation.DirectionalNavigation="Cycle">