2009-04-28 12 views
17

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

यह बहुत आसान लगता है, लेकिन एक हाइराचिकलडेटा टेम्पलेट को शामिल करने से चीजों को थोड़ा जटिल बना दिया जाता है। कैसे मैं एक EventSetter ऊपर जोड़ने

<TreeView 
      x:Name="trv" 
      ContextMenu="{StaticResource contextMenu}" 
      ItemTemplate="{StaticResource treeHierarchicalDataTemplate}" 
      ItemsSource="{Binding Source={StaticResource meetingItems}}" > 

      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="trv_PreviewMouseRightButtonDown"/> 
        <Setter Property="IsExpanded" Value="True"></Setter> 
       </Style> 
      </TreeView.ItemContainerStyle> 
     </TreeView> 

और यहाँ मेरी ईवेंट हैंडलर है ...

private void trv_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeViewItem item = sender as TreeViewItem; 
    if (item != null) 
    { 
     item.Focus(); 
     e.Handled = true; 
    } 

} 

नोट:

मैं निम्नलिखित treeview है। यह सबसे काम करता है। लेकिन यह केवल रूट-स्तरीय वृक्षदृश्य नोड का चयन करता है (यानी नोड के मूल अभिभावक जिस पर मैं दायाँ क्लिक करता हूं)। यह मेरे पदानुक्रमित डेटा टेम्पलेट के कारण हो सकता है? इस टेम्पलेट में एक ही प्रकार के बच्चे हो सकते हैं।

यहाँ

मेरी श्रेणीबद्ध डेटा टेम्पलेट है ...

<HierarchicalDataTemplate x:Key="treeHierarchicalDataTemplate" 
          ItemsSource="{Binding Path=ChildMeetingItems}"> 
    <HierarchicalDataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=Red}" Value="True"> 
      <Setter TargetName="img" Property="Image.Source" Value="pack://siteoforigin:,,,/images/bookRed.png"></Setter> 
     </DataTrigger> 
    </HierarchicalDataTemplate.Triggers> 
    <StackPanel 
     x:Name="treeViewItemPanel" 
     Background="Transparent" 
     Orientation="Horizontal"> 
     <Image Width="16" Height="16" x:Name="img" Margin="0,0,4,0" Source="pack://siteoforigin:,,,/images/bookGreen.png"></Image> 
     <TextBlock Foreground="DarkGray" Text="{Binding DisplayIndex}" Margin="0,0,5,0"></TextBlock> 
     <TextBlock Text="{Binding Summary}"></TextBlock> 
    </StackPanel> 
</HierarchicalDataTemplate> 

कारण है कि जब मैं राइट क्लिक करें बच्चे नोड्स के स्थान पर केवल रूट नोड का चयन किया जाता पर कोई विचार?

उत्तर

15

ऐसा इसलिए है क्योंकि ItemContainerStyle को बच्चे नोड्स द्वारा विरासत में नहीं मिला है। आपको अपने HierarchicalDataTemplate को ItemContainerStyle पर एक ही EventSetter जोड़ने की आवश्यकता है।

<HierarchicalDataTemplate x:Key="treeHierarchicalDataTemplate" 
          ItemsSource="{Binding Path=ChildMeetingItems}"> 
    <HierarchicalDataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=Red}" Value="True"> 
      <Setter TargetName="img" Property="Image.Source" Value="pack://siteoforigin:,,,/images/bookRed.png"></Setter> 
     </DataTrigger> 
    </HierarchicalDataTemplate.Triggers> 
    <StackPanel 
     x:Name="treeViewItemPanel" 
     Background="Transparent" 
     Orientation="Horizontal"> 
     <Image Width="16" Height="16" x:Name="img" Margin="0,0,4,0" Source="pack://siteoforigin:,,,/images/bookGreen.png"></Image> 
     <TextBlock Foreground="DarkGray" Text="{Binding DisplayIndex}" Margin="0,0,5,0"></TextBlock> 
     <TextBlock Text="{Binding Summary}"></TextBlock> 
    </StackPanel> 

<HierarchicalDataTemplate.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="trv_PreviewMouseRightButtonDown"/>      
       </Style> 
      </HierarchicalDataTemplate.ItemContainerStyle> 
</HierarchicalDataTemplate> 
+0

धन्यवाद डेनिस। यह समझ आता है। मैं अभी भी अजीब व्यवहार कर रहा हूं ... अगर मैं दोनों पदानुक्रम डेटाटाम्प्लेट और वृक्षदृश्य पर ItemContainerStyle सेट करता हूं, तो यह अभी भी पहले जैसा ही करता है। अगर मैं केवल पांडुक्रमित डेटाटाम्प्लेट पर ItemContainerStyle सेट करता हूं, तो यह वही काम करता है, लेकिन इस बार केवल दूसरे स्तर पर नोड्स के लिए। अजीब। कोई विचार? – willem

+1

आह, दिलचस्प। यह ई। हैंडल = सच के कारण हो रहा था। 100% निश्चित नहीं है कि क्यों ... – willem

+4

क्योंकि आप एक सुरंग घटना (एक पूर्वावलोकन XXX घटना) को संभालने वाले हैं। ये घटनाएं पेड़ के नीचे से नीचे तक जाती हैं, इसलिए यदि आप रूट पर ई। हैंडल = सत्य सेट करते हैं, तो यह वहां रुक जाएगा और पेड़ को आपके आइटम पर सुरंग नहीं करेगा। –

5

बस अपने ईवेंट हैंडलर से e.Handler=true पर टिप्पणी करें।

इस तरह:

private void trv_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeViewItem item = sender as TreeViewItem; 
    if (item != null) 
    { 
     item.Focus(); 
     // e.Handled = true; 
    } 

} 
+0

यह मेरे बहु-स्तरीय वृक्षदृश्य के लिए काम करता है। '' e.Handled = true; '' 'हैंडलर ईवेंट को रोक देगा और इसे पहले स्तर पर रोक देगा, यही कारण है कि केवल रूट तत्व या प्रथम स्तर तत्व का चयन किया जा सकता है। – Adison

0

मैं एक ही समस्या थी - उचित चयनित ट्री आइटम नहीं मिल सका।

<StackPanel DataContext="{Binding}" MouseLeftButtonDown="StackPanel_MouseLeftButtonDown"> 
.... 
</StackPanel> 

और ईवेंट हैंडलर कोड-पीछे:

private void StackPanel_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      StackPanel panel = sender as StackPanel; 
      if(panel==null)return; 
      MyTreeViewItem myClicked = panel.DataContext as MyTreeViewItem; 
      if (myClicked == null) return; 
... 
} 

MyTreeViewItem एक डेटा के लिए अपने कस्टम प्रकार है और बजाय PreviewMouseRightButtonDown घटना का उपयोग कर के मैं एक StackPanel जो भी सभी आवश्यक कार्रवाई डेटा संग्रहीत करता है की एक ही घटना के लिए इस्तेमाल किया ; myClicked अब क्लिक किए गए पेड़ आइटम से जुड़े डेटा को स्टोर करता है। आशा है कि यह मेरे जैसे किसी की मदद करेगा।

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