WPFでは、ツリービュー項目を右クリックすると、コンテキストメニューを表示する前に選択/アクティブ化したいと思っています。WPFでは、右クリックするとカーソル下のツリービュー項目をどのように選択できますか?
これはかなり単純ですが、hierachicalDataTemplateを含めると少し複雑になります。私は上記の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;
}
}
注:
は、私は、次のツリービューを持っています。このALMOSTは機能します。しかし、それは、ルートレベルツリービューノード(すなわち、右クリックするノードのルート親)のみを選択する。これは私の階層的なデータテンプレートのためかもしれません?このテンプレートには、同じタイプの子を含めることができます。ここで
私の階層的なデータテンプレートがある...
<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>
私は右クリックしたときに代わりに子ノードのルートノードのみが選択されている理由上の任意のアイデア?
ありがとうDenis。それは理にかなっている。私はまだ奇妙な動作をしています...もし私がhierarchicalDataTemplateとtreeviewの両方でItemContainerStyleを設定すると、前と同じように動作します。 hierarchicalDataTemplateでItemContainerStyleのみを設定すると、同じことが実行されますが、今度は2番目のレベルのノードのみです。奇妙な。何か案は? – willem
ああ、面白いです。 e.Handled = trueのために起こっていました。あなたがトンネリングイベント(PreviewXXXイベント)を処理しているため、理由は100%ではありません。 – willem
これらのイベントはツリーの上から下に行くので、ルートでe.Handled = trueを設定した場合は、そこで停止し、ツリーを項目にトンネリングしません。 –