2

要約
された質問: WPF TreeView で、現在選択されている項目に選択されたイベントを強制するにはどうすればよいですか?

詳細情報:
シフト (範囲) とコントロール (項目の選択を切り替える) を使用して複数選択を追加することにより、WPF TreeView に機能を追加しようとしています。TreeView には選択されたアイテムしかないため、独自の SelectedItems コレクションを実装しました。キーボードの機能を壊さないように TreeView の SelectedItem を引き続き使用しますが、既存の ItemContainerStyle を上書きして、項目が選択されていても、選択されているように見えないようにします。これを行う必要はありませんでしたが、アイテムの幅全体ではなく、選択したツリービューアイテムのテキストブロックの背景のみを強調表示する必要があったため、前景色と背景色の変更を自分で処理しました。

4

1 に答える 1

1

WPF ツリービューの実装には多くの XAML が使用されるため、この回答にはコードの断片のみが含まれています。

私の目標は、左側のペインで選択したツリービュー アイテムをクリックし、右側のペイン (Windows エクスプローラーなど) でアイテムを更新することでした。

選択したツリービュー アイテムの選択を機能させるために、ViewModel で次の XAML の例に 2 つのイベントを実装しました。

  • イベント TreeViewItem.Selected を使用した OnItemSelected
  • イベント TreeViewItem.MouseLeftButtonUp を使用した MouseLeftButtonUp

MouseLeftButtonUp イベントが発生したら、次を使用してイベントを処理したことを示すようにします。

  • args.Handled = true;

ここにXAMLがあります

<TreeView Name="MyTreeView" 
    ItemsSource="{Binding Collections}" 
    Margin="0"                           
    Grid.Row="0"
    TreeViewItem.Selected="OnItemSelected"
    TreeViewItem.Unselected="OnItemUnSelected">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="TreeViewItem.MouseLeftButtonUp" Handler="MouseLeftButtonUp"/>
            <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
            <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>

    <!-- other XAML removed for this answer-->

</TreeView>

ここにイベントハンドラがあります

private void OnItemSelected(object sender, RoutedEventArgs e)
{
     // do something...
}


// additional info: cannot detect mouse down events; preview mouse events also work
private void MouseLeftButtonUp(object sender, MouseButtonEventArgs args)
{
   TreeViewItem tvi = sender as TreeViewItem;
   if (tvi != null)
   {
      // process folder items
      MyViewModel fvm = tvi.Header as MyViewModel;
      if (fvm != null)
      {
         // only process selected treeview items
         if (fvm.IsSelected)
         {
            fvm.IsSelected = true;

            // prevent bubbling once we find the  selected tree view item
            args.Handled = true;
         }
      }
}
于 2010-01-11T03:00:02.580 に答える