2009-01-13 34 views

Respuesta

8

La respuesta directa a su pregunta es que no hay propiedades de nivel en WPF.

No existe una relación de uno a uno entre los controles de winforms y el control de wpf. Porque la arquitectura y el uso subyacentes son totalmente diferentes en ambos. En WPF va a encuadernar un conjunto de datos jerárquica (LinkedList tipo de estructura de datos) a un TreeView y definir un HeirarchicalDataTemplate a la propiedad Treeview.ItemTemplate

7

Dada la Consulta: -

así que cuando hago clic en un nodo, cómo ¿sé qué nivel es? ¿hay solución?

He aquí una posible solución: -

Si usted tiene una referencia a un control en el Visual árbol, posiblemente de un evento Click continuación, puede utilizar ese control de averiguar qué nivel se encuentra en la vista de árbol llamando a una función como esta, que he usado en el pasado.

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; 
} 

Este método va a subir por la VisualTree y contar cuántas TreeViewItem controles que encuentra antes de parar cuando encuentre el control TreeView.

Si necesita esta disponible en XAML, por ejemplo, un DataTrigger de un HierarchicalDataTemplate entonces usted podría paquete de esto en una clase de 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> 

A continuación, utilice el siguiente convertidor

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(); 
    } 
    } 
Cuestiones relacionadas