2009-01-13 111 views

回答

8

直接回答你的問題是WPF中沒有level屬性。

winforms控件和wpf控件之間沒有一對一的關係。因爲底層架構和用法在兩者中完全不同。在WPF中,你會heirarchical數據(LinkedList的一種數據結構網絡化的)綁定到TreeView和定義HeirarchicalDataTemplate來考慮問題的Treeview.ItemTemplate財產

7

: -

所以當我點擊一個節點,如何我知道它是哪個級別嗎?有解決方法嗎?

這裏是一個可能的解決方法: -

如果你有在視覺樹到控件的引用,可能是從一個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又算什麼呢,當它發現TreeView控制停止之前,有多少TreeViewItem控制認定。

如果您需要在XAML這個可用,例如HierarchicalDataTemplateDataTrigger,那麼你可以在一個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(); 
    } 
    }