13

WinFormsアプリケーションでは、a のレベルはWPF 対応するコマンドは何ですか?treeviewによって与えられます。node.level

4

2 に答える 2

9

質問を考えると:-

ノードをクリックしたときに、それがどのレベルかをどのように知ることができますか? 回避策はありますか?

考えられる回避策は次のとおりです。

おそらくイベントからVisual TreeにControl への参照がある場合、Clickそのコントロールを使用して、私が過去に使用したこのような関数を呼び出すことで、ツリー ビューのどのレベルにあるかを調べることができます。

private int FindTreeLevel(DependencyObject control)
{
  var level = -1;
  if (control != null)
  {
    var parent = VisualTreeHelper.GetParent(control);
    while (!(parent is TreeView) && (parent != null))
    {
      if (parent is TreeViewItem)
        level++;
      parent = VisualTreeHelper.GetParent(parent);
    }
  }
  return level;
}

このメソッドは、VisualTree をたどり、見つかったコントロールの数をカウントしてから、コントロールTreeViewItemを見つけたときに停止しTreeViewます。

これを XAML で使用できるようにする必要がある場合 (たとえば、 aDataTriggerの aなど)、これをクラスHierarchicalDataTemplateにパッケージ化できます。IValueConverter

<Window.Resources>
  <local:TreeLevelConverter x:Key="treeLevelConverter"/>

  <HierarchicalDataTemplate DataType="{x:Type local:MyType}" >
  ...
     <Grid ... >
         <TextBlock x:Name="MyControl" ... />
     ...
     </Grid>
     <HierarchicalDataTemplate.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource treeLevelConverter}}" Value="0" >
              <Setter TargetName="MyControl" Property="Background" Value="Red"/>
        </DataTrigger>
    </HierarchicalDataTemplate.Triggers>
  </HierarchicalDataTemplate>
</Window.Resources>

次に、次のコンバーターを使用します

  public class TreeLevelConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
      var level = -1;
      if (value is DependencyObject )
      {
        var parent = VisualTreeHelper.GetParent(value as DependencyObject );
        while (!(parent is TreeView) && (parent != null))
        {
          if (parent is TreeViewItem) 
            level++;
          parent = VisualTreeHelper.GetParent(parent);
        }
      }
      return level;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
      throw new System.NotImplementedException();
    }
  }
于 2009-01-21T11:33:26.270 に答える
8

あなたの質問に対する直接的な答えは、WPF には level プロパティがないということです。

winforms コントロールと wpf コントロールの間には 1 対 1 の関係はありません。基盤となるアーキテクチャと使用法が両者でまったく異なるためです。WPF では、階層型データ (データ構造の LinkedList の種類) を TreeView にバインドし、HeirarchicalDataTemplate を Treeview.ItemTemplate プロパティに定義します。

于 2009-01-13T06:11:35.500 に答える