2011-01-19 4 views
6

डब्ल्यूपीएफ ट्रीव्यू + और - पेड़ में नोड्स को विस्तार और संक्षिप्त करने के लिए कीस्ट्रोक का जवाब देता है। महान!क्या ट्रीव्यूव विस्तार/पतन के लिए कमांड बाइंडिंग का उपयोग करता है?

क्या कोई मौजूदा कमांड है जो मैं अपने टूलबार बटन या मेनू आइटम को ट्रीव्यू में समान क्रियाएं करने के लिए बाध्य कर सकता हूं? मुझे स्टॉक कमांड स्थिरांक में विस्तार/पतन से संबंधित कुछ भी नहीं दिख रहा है।

उत्तर

5

TreeViewControlTemplate में TreeViewItem.IsExpanded करने के लिए ToggleButton.IsChecked जुड़ कर माउस के साथ एक TreeViewItem के विस्तार संभालती है और एक ओवरराइड TreeViewItem.OnKeyDown में कीबोर्ड के साथ विस्तार संभालती है। तो, नहीं, यह इसके कार्यान्वयन में कमांड का उपयोग नहीं करता है।

लेकिन आप बिना किसी प्रयास के अपने स्वयं के आदेश जोड़ सकते हैं। इस उदाहरण में, मैं करने के लिए एक व्यवहार जोड़ दिया है एक TreeView इतना है कि यह मानक Open और Close आवेदन आदेशों का जवाब:

<DockPanel> 
    <Menu DockPanel.Dock="Top"> 
     <MenuItem Header="Open" CommandTarget="{Binding ElementName=treeView1}" Command="Open"/> 
     <MenuItem Header="Close" CommandTarget="{Binding ElementName=treeView1}" Command="Close"/> 
    </Menu> 
    <TreeView> 
     <i:Interaction.Behaviors> 
      <local:TreeViewCommandsBehavior/> 
     </i:Interaction.Behaviors> 
     <TreeViewItem Header="Root"> 
      <TreeViewItem Header="Item1"> 
       <TreeViewItem Header="Subitem1"/> 
       <TreeViewItem Header="Subitem2"/> 
      </TreeViewItem> 
      <TreeViewItem Header="Item2"> 
       <TreeViewItem Header="Subitem3"/> 
       <TreeViewItem Header="Subitem4"/> 
      </TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 
</DockPanel> 

और यहाँ व्यवहार है कि बनाता है काम:

public class TreeViewCommandsBehavior : Behavior<TreeView> 
{ 
    private TreeViewItem selectedTreeViewItem; 

    protected override void OnAttached() 
    { 
     AssociatedObject.AddHandler(TreeViewItem.SelectedEvent, new RoutedEventHandler(TreeViewItem_Selected)); 
     AssociatedObject.CommandBindings.Add(new CommandBinding(ApplicationCommands.Open, CommandExecuted)); 
     AssociatedObject.CommandBindings.Add(new CommandBinding(ApplicationCommands.Close, CommandExecuted)); 
    } 

    private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 
     selectedTreeViewItem = e.OriginalSource as TreeViewItem; 
    } 

    private void CommandExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     bool expand = e.Command == ApplicationCommands.Open; 
     if (selectedTreeViewItem != null) 
      selectedTreeViewItem.IsExpanded = expand; 
    } 
} 

यदि आप व्यवहार से परिचित नहीं हैं, तो पहले इस नामस्थान को जोड़ें:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

और अपने proje के संबंधित संदर्भ जोड़ें सीटी।

+2

ध्यान दें कि System.Windows.Interactivity असेंबली .NET 4.0 रनटाइम वितरण का हिस्सा नहीं है; यह माइक्रोसॉफ्ट एक्सप्रेशन ब्लेंड एसडीके पुनर्वितरण में उपलब्ध है। – dthorpe

+0

किसी भी तरह, उस तथ्य ने मुझे दूर कर दिया था, शायद इसलिए कि असेंबली का नाम। यद्यपि यह बाहरी असेंबली पर निर्भरता बनाता है, व्यवहार का उपयोग करना एक बड़ी जीत है क्योंकि यह किसी भी कोड-पीछे शामिल किए बिना सुविधा को पुन: प्रयोज्य बनाता है। यह बात बताने के लिए धन्यवाद। –

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