2009-04-28 7 views
17

Wenn ich in WPF mit der rechten Maustaste auf ein Baumansichtselement klicke, möchte ich, dass es ausgewählt/aktiviert wird, bevor das Kontextmenü angezeigt wird.Wie wähle ich in WPF das Treeview-Element unter meinem Cursor mit der rechten Maustaste?

Das klingt ziemlich einfach, aber die Aufnahme eines hierarchicalDataTemplate kompliziert die Dinge ein wenig.

Ich habe folgendes treeview:

<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> 

Und hier ist mein Event-Handler ...

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

} 

Beachten Sie, wie ich eine Eventsetter oben hinzuzufügen. Das funktioniert fast. Aber es wählt nur den Treeview-Knoten auf Root-Ebene aus (d. H. Den Root-Parent des Knotens, auf den ich mit der rechten Maustaste klicke). Dies kann an meiner hierarchischen Datenvorlage liegen? Diese Vorlage kann untergeordnete Elemente desselben Typs enthalten.

Hier ist meine hierarchische Datenvorlage ...

<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> 

Jede Idee, warum nur der Wurzelknoten anstelle von untergeordneten Knoten ausgewählt werden, wenn ich mit der rechten klicken Sie auf?

Antwort

15

Das liegt daran, dass der ItemContainerStyle nicht von den untergeordneten Knoten vererbt wird. Sie müssen den gleichen EventSetter auf dem ItemContainerStyle Ihrer HierarchicalDataTemplate hinzufügen.

<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

Dank Denis. Das macht Sinn. Ich bekomme immer noch merkwürdiges Verhalten ... wenn ich den ItemContainerStyle sowohl auf der hierarchicDataTemplate als auch auf der Baumansicht setze, dann macht es immer noch dasselbe wie vorher. Wenn ich den ItemContainerStyle nur auf dem hierarchicalDataTemplate setze, tut es dasselbe, aber dieses Mal nur für Knoten auf der zweiten Ebene. Seltsam. Irgendwelche Ideen? – willem

+1

Aah, interessant. Das passierte aufgrund des e.Handled = true. Nicht 100% sicher, warum, obwohl ... – willem

+4

Weil Sie ein Tunneling-Ereignis behandeln (ein PreviewXXX-Ereignis). Diese Ereignisse gehen von oben nach unten. Wenn Sie also e.Handled = true an der Wurzel setzen, wird es dort anhalten und den Baum nicht zu Ihrem Objekt durchtunneln. –

5

Kommentieren Sie einfach die e.Handler=true von Ihrem Event-Handler.

wie folgt aus:

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

} 
+0

Dies funktioniert für meine mehrstufige Treeview. '' 'e.Handled = true;' '' stoppt das Handler-Ereignis und stoppt es auf der ersten Ebene, deshalb kann nur das root-Element oder das Element der ersten Ebene ausgewählt werden. – Adison

0

hatte ich das gleiche Problem - nicht die richtige ausgewählte Strukturelement erhalten könnte. Und statt PreviewMouseRightButtonDown Fall verwendet, um I gleiche Falle eineine StackPanel die auch alle nötigen Daten speichert:

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

und die Event-Handler Code-Behind:

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 ist mein benutzerdefinierter Typ für ein Datum ; myClicked speichert nun Daten, die mit dem angeklickten Baumelement verknüpft sind. Ich hoffe, es wird jemandem wie mir helfen.