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?
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
Aah, interessant. Das passierte aufgrund des e.Handled = true. Nicht 100% sicher, warum, obwohl ... – willem
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. –