2010-09-23 12 views
8

मैं पहली बार डब्ल्यूपीएफ ट्रीव्यूव का उपयोग कर रहा हूं और पर सभी मूलभूत चीजों से आश्चर्यचकित हूं। उनमें से एक कुंजीपटल नेविगेशन है, किसी भी आत्म-सम्मानित वृक्षदृश्य में लागू किया गया है, उदा। विंडोज एक्सप्लोरर या रेजीडिट में।डब्ल्यूपीएफ वृक्षदृश्य: एक्सप्लोरर में कीबोर्ड नेविगेशन को कैसे कार्यान्वित करें?

यह है कि यह कैसे काम करना चाहिए है: treeview ध्यान केंद्रित किया है और मैं टाइप करें (पत्र/संख्या)

तो चयन पहला दृश्य (उर्फ विस्तार) वर्तमान में चयनित आइटम नीचे आइटम पर जाने चाहिए कि मैंने टाइप की गई स्ट्रिंग से मेल खाता है और इसे देखने में लाता है। यदि मौजूदा आइटम के नीचे मिलान नहीं मिलता है तो खोज शीर्ष से जारी रहनी चाहिए। यदि कोई मिलान नहीं मिलता है, तो चयनित आइटम नहीं बदला जाना चाहिए।

जब तक मैं टाइपिंग जारी रखता हूं, खोज स्ट्रिंग बढ़ती है और खोज परिष्कृत होती है। अगर मैं एक निश्चित समय (2-5 सेकंड) के लिए टाइप करना बंद कर देता हूं, तो खोज स्ट्रिंग खाली हो जाती है।

मैं इसे "हाथ से" स्क्रैच से प्रोग्राम करने के लिए तैयार हूं, लेकिन चूंकि यह बहुत ही बुनियादी है, मैंने सोचा कि निश्चित रूप से किसी ने पहले से ही यह किया है।

उत्तर

4

मजेदार, यह एक लोकप्रिय विषय प्रतीत नहीं होता है। वैसे भी, इस दौरान मैंने समस्या का समाधान विकसित किया है जो मुझे संतुष्ट करता है:

मैं TreeViewItems को एक व्यवहार संलग्न करता हूं। उस व्यवहार में, मैं कीप घटनाओं को संभालता हूं। कीप इवेंट हैंडलर में, मैं दृश्य पेड़ को नीचे से नीचे दिखाता हूं जैसा कि यह प्रदर्शित होता है। अगर मुझे पहला मिलान नोड मिलता है (जिसका नाम दबाए गए कुंजी पर अक्षर से शुरू होता है) तो मैं उस नोड का चयन करता हूं।

+4

क्या आप कोड कोड नमूना संलग्न कर सकते हैं? धन्यवाद। –

+0

मैं कोड नमूना –

+0

@ हेल्गे क्लेन की भी सराहना करता हूं: जैसा कि आपने कहा था कि आपने पहले से ही एक समाधान विकसित किया है - क्या आप कोड नमूना साझा कर सकते हैं? – digitguy

1

मैं कीबोर्ड नेविगेशन की भी तलाश कर रहा था, आश्चर्यजनक था कि समाधान टेम्पलेट आइटम के लिए स्पष्ट नहीं था।

ListView या TreeView में चयनित वैल्यूपैथ सेट करना यह व्यवहार देता है। यदि आइटम टेम्पलेट किए गए हैं तो अटैचमेंट प्रॉपर्टी सेट करें: टेक्स्टशर्च। टेक्स्टपाथ पर संपत्ति के पथ पर खोज करने के लिए यह चाल भी होगी।

उम्मीद है कि यह मदद करता है, यह निश्चित रूप से मेरे लिए काम करता है।

+0

मैं इसे काम पर नहीं ला सकता हूं। क्या आप उस मामले के लिए कोड नमूना प्रदान कर सकते हैं जहां TreeView एक HierarchicalDataTemplate का उपयोग करता है? –

0

यह बहुत सरल नहीं है जैसा कि हम उम्मीद करते हैं। लेकिन मुझे मिला सबसे अच्छा समाधान यहां है: http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode

मुझे और जानकारी चाहिए यदि आपको अधिक जानकारी चाहिए।

+0

मैं निश्चित रूप से उस लेख को जानता हूं। यह कुंजीपटल नेविगेशन को कार्यान्वित करने का वर्णन नहीं करता है। –

+0

हां मैं सहमत हूं। हालांकि हम उस आलेख में विधियों का उपयोग करके सरल खोज को कार्यान्वित कर सकते हैं, लेकिन वृद्धिशील खोज करना बहुत मुश्किल है। जैसा कि आपने कहा है कि आपने पहले से ही एक समाधान विकसित किया है - क्या आप कोड नमूना साझा कर सकते हैं? – digitguy

1

मुझे पता है कि यह एक पुराना विषय है, लेकिन मुझे लगता है कि यह अभी भी कुछ लोगों के लिए प्रासंगिक है। मैंने यह समाधान किया। यह एक WPF TreeView पर KeyUp और TextInput ईवेंट से जुड़ा हुआ है। मैं KeyUp के अलावा TextInput का उपयोग कर रहा हूं क्योंकि मुझे "राष्ट्रीय" वर्णों को KeyEventArgs के साथ वास्तविक वर्णों में अनुवाद करने में कठिनाई हुई थी। यह TextInput के साथ और अधिक चिकनी चला गया।

// <TreeView Name="treeView1" KeyUp="treeView1_KeyUp" TextInput="treeView1_TextInput"/> 

    private bool searchdeep = true;    // Searches in subitems 
    private bool searchstartfound = false;  // true when current selected item is found. Ensures that you don't seach backwards and that you only search on the current level (if not searchdeep is true) 
    private string searchterm = "";    // what to search for 
    private DateTime LastSearch = DateTime.Now; // resets searchterm if last input is older than 1 second. 

    private void treeView1_KeyUp(object sender, System.Windows.Input.KeyEventArgs e) 
    { 
     // reset searchterm if any "special" key is pressed 
     if (e.Key < Key.A) 
      searchterm = ""; 

    } 

    private void treeView1_TextInput(object sender, TextCompositionEventArgs e) 
    { 
     if ((DateTime.Now - LastSearch).Seconds > 1) 
      searchterm = ""; 

     LastSearch = DateTime.Now; 
     searchterm += e.Text; 
     searchstartfound = treeView1.SelectedItem == null; 

     foreach (var t in treeView1.Items) 
      if (SearchTreeView((TreeViewItem) t, searchterm.ToLower())) 
       break; 
    } 

    private bool SearchTreeView(TreeViewItem node, string searchterm) 
    { 
     if (node.IsSelected) 
      searchstartfound = true; 

     // Search current level first 
     foreach (TreeViewItem subnode in node.Items) 
     { 
      // Search subnodes to the current node first 
      if (subnode.IsSelected) 
      { 
       searchstartfound = true; 
       if (subnode.IsExpanded) 
        foreach (TreeViewItem subsubnode in subnode.Items) 
         if (searchstartfound && subsubnode.Header.ToString().ToLower().StartsWith(searchterm)) 
         { 
          subsubnode.IsSelected = true; 
          subsubnode.IsExpanded = true; 
          subsubnode.BringIntoView(); 
          return true; 
         } 
      } 
      // Then search nodes on the same level 
      if (searchstartfound && subnode.Header.ToString().ToLower().StartsWith(searchterm)) 
      { 
       subnode.IsSelected = true; 
       subnode.BringIntoView(); 
       return true; 
      } 
     } 

     // If not found, search subnodes 
     foreach (TreeViewItem subnode in node.Items) 
     { 
      if (!searchstartfound || searchdeep) 
       if (SearchTreeView(subnode, searchterm)) 
       { 
        node.IsExpanded = true; 
        return true; 
       } 
     } 

     return false; 
    } 
+0

धन्यवाद! यह अद्भुत काम करता है।मुझे बस जो चाहिए उसे प्राप्त करने के लिए मुझे समय 500 मिलीसेकंड में बदलना पड़ा। – JMooney