wpf

2011-06-20 10 views
23

में फ़ाइल पथों की सूची से वृक्षदृश्य को पॉप्युलेट करें this या this other उदाहरण जैसे फ़ाइल पथों के संग्रह से वृक्ष दृश्य को कैसे पॉप्युलेट करना है इसके कई उदाहरण हैं। मुझे डब्ल्यूपीएफ के लिए ऐसा उदाहरण नहीं मिल रहा है। मुझे पता है कि मैं विंडोज़ फॉर्म को एकीकृत कर सकता हूं और इसे काम करने के लिए एक अलग नियंत्रण का उपयोग कर सकता हूं लेकिन यह अच्छा होगा अगर मैं एक ही चीज़ को डब्लूपीएफ ट्रीव्यू कंट्रोल के साथ कर सकता हूं। पेड़ दृश्य जिसे मैं बनाना चाहता हूं, में लगभग 50,000 फाइलें हैं, इसलिए मुझे लगता है कि यह बेहतर होगा अगर यह किसी चीज़ से बंधे। लेकिन इसे बाध्य करने से पहले, मुझे लगता है कि स्ट्रिंग्स की सूची के आधार पर इसे बनाने में मददगार होगा (तारों में फाइलों के पथ होते हैं)।wpf

+1

आपको पहले पूरे संग्रह को पॉप्युलेट नहीं करना पड़ेगा। आप पेड़ नियंत्रण मांग पर लाने के लिए हो सकता है। मैंने इसके लिए टेलीरिकिक्स पेड़ नियंत्रण का उपयोग किया है। –

उत्तर

53

मैं इस सवाल से चिंतित था और इसे एक साथ फेंक दिया। पहले पास के रूप में मुझे लगता है कि मैं जो कुछ ढूंढ रहा हूं उसके करीब हूं। लगभग 50,000 वस्तुओं के बारे में बात करते हुए मुझे लगता है कि आलसी लोडिंग उचित हो सकती है। वैसे भी, जोश स्मिथ द्वारा article पर आधारित सरल संस्करण है। मैंने यहां सभी कोड डाले हैं, लेकिन जादू वास्तव में डेटा टेम्पलेट्स के साथ होता है।

वस्तुओं हम साथ काम कर रहे ... का प्रतिनिधित्व करने के कुछ वर्गों को देखते हुए

using System.Collections.Generic; 

namespace WpfTreeViewBinding.Model 
{ 
    public class Item 
    { 
     public string Name { get; set; } 
     public string Path { get; set; } 
    } 
} 

और ...

namespace WpfTreeViewBinding.Model 
{ 
    public class FileItem : Item 
    { 

    } 
} 

और ...

namespace WpfTreeViewBinding.Model 
{ 
    public class DirectoryItem : Item 
    { 
     public List<Item> Items { get; set; } 

     public DirectoryItem() 
     { 
      Items = new List<Item>(); 
     } 
    } 
} 

मैं कुछ निर्देशिकाओं/फ़ाइलों को लोड करने के लिए एक पुनरावर्ती विधि बनाई ...

using System.Collections.Generic; 
using System.IO; 
using WpfTreeViewBinding.Model; 

namespace WpfTreeViewBinding 
{ 
    public class ItemProvider 
    { 
     public List<Item> GetItems(string path) 
     { 
      var items = new List<Item>(); 

      var dirInfo = new DirectoryInfo(path); 

      foreach(var directory in dirInfo.GetDirectories()) 
      { 
       var item = new DirectoryItem 
           { 
            Name = directory.Name, 
            Path = directory.FullName, 
            Items = GetItems(directory.FullName) 
           }; 

       items.Add(item); 
      } 

      foreach(var file in dirInfo.GetFiles()) 
      { 
       var item = new FileItem 
           { 
            Name = file.Name, 
            Path = file.FullName 
           }; 

       items.Add(item); 
      } 

      return items; 
     } 
    } 
} 

वहां से यह डेटा प्राप्त करने का मामला है ...

using System.Windows; 

namespace WpfTreeViewBinding 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      var itemProvider = new ItemProvider(); 

      var items = itemProvider.GetItems("C:\\Temp"); 

      DataContext = items; 
     } 
    } 
} 

और यह प्रदर्शित ...

<Window x:Class="WpfTreeViewBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:Model="clr-namespace:WpfTreeViewBinding.Model" 
     Title="MainWindow" 
     Height="350" Width="525"> 

    <Window.Resources> 

     <HierarchicalDataTemplate DataType="{x:Type Model:DirectoryItem}" 
            ItemsSource="{Binding Items}"> 
      <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" /> 
     </HierarchicalDataTemplate> 

     <DataTemplate DataType="{x:Type Model:FileItem}"> 
      <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Path=Path}" /> 
     </DataTemplate> 

    </Window.Resources> 

    <Grid Margin="8"> 
     <TreeView ItemsSource="{Binding}" /> 
    </Grid> 

</Window> 

जादू सब के सब वास्तव में डेटा टेम्पलेट्स के साथ होता है। मुझे लगता है कि पूरी चीज की कुंजी पदानुक्रम (यानी निर्देशिका) वाले किसी भी आइटम के लिए HierarchicalDataTemplate का उपयोग कर रही है।

नोट 1: मैंने इसका व्यापक परीक्षण नहीं किया है। इसे प्रदर्शन के लिए प्रोफाइल नहीं किया गया है। मैं किसी भी प्रतिक्रिया का स्वागत करता हूं हालांकि यह एक समस्या है क्योंकि मैंने बहुत पहले हल करने की कोशिश की और छोड़ दिया। धन्यवाद!

नोट 2: आपको हार्ड-कोडेड पथ को उस चीज़ पर सेट करने की आवश्यकता होगी जो आपके सिस्टम पर समझ में आता है।

यहाँ विभिन्न स्तरों पर निर्देशिका और फाइल को दिखाने वाले स्क्रीनशॉट है ...

enter image description here

+0

झोन बहुत बहुत धन्यवाद! आपका जवाब बहुत अच्छा लग रहा है। जब मैं कल सुबह वापस आऊंगा तो मैं आपके समाधान का परीक्षण करने की उम्मीद कर रहा हूं। किसी और संपादन में काम न करें ... मुझे पहले इसका परीक्षण करने दें। –

+4

यह एक अच्छा जवाब है। हालांकि, कोई आइटम और फ़ाइल इटैम क्लास बनाने की आवश्यकता नहीं है। आप दोनों सिस्टम के लिए एक स्थानीय डेटा टेम्पलेट बना सकते हैं।IO DirectoryInfo और FileInfo कक्षाएं। –

+0

अब आलसी लोडिंग का उपयोग करने के लिए इसे बढ़ाएं:] – cordialgerm

3
पिछले समाधान के लिए

छोटे विस्तार: मैं के लिए माउस के बीच स्विच करने के लिए माउस का समर्थन करने के XAML कोड, और समर्थन जोड़ा खोला और बंद फ़ोल्डर:

<HierarchicalDataTemplate DataType="{x:Type viewModels:SourceControlDirecoryViewModel}" 
            ItemsSource="{Binding Items}"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="5" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 
       <Image Width="16" 
         Height="16" 
         Source="{StaticResource ImageSourceFolderClosed16x16}" 
         x:Name="img" /> 
       <TextBlock Text="{Binding Path=Name}" 
          ToolTip="{Binding Path=Path}" 
          Grid.Column="2" /> 
      </Grid> 
      <DataTemplate.Triggers> 
       <DataTrigger Binding="{Binding IsExpanded, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}}}" 
          Value="True"> 
        <Setter Property="Source" 
          TargetName="img" 
          Value="{StaticResource ImageSourceFolderOpened16x16}" /> 
       </DataTrigger> 
      </DataTemplate.Triggers> 
     </HierarchicalDataTemplate> 
संबंधित मुद्दे