Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 多个类似层次结构的一个模板CalDataTemplate-s?_Wpf_Treeview_Controltemplate_Hierarchicaldatatemplate - Fatal编程技术网

Wpf 多个类似层次结构的一个模板CalDataTemplate-s?

Wpf 多个类似层次结构的一个模板CalDataTemplate-s?,wpf,treeview,controltemplate,hierarchicaldatatemplate,Wpf,Treeview,Controltemplate,Hierarchicaldatatemplate,我有一个TreeView组件,它可以包含几种类型的节点。除了我有多个层次化的数据模板外,它都工作得很好。这些模板只在它们显示的字形图像、数据类型和项目资源上有所不同,但其他一切都完全相同 我想知道,是否可以为所有分层数据模板创建一个ControlTemplate,并使用tag属性修改图标图像 例如,我有基本的TreeNode类和节点,比如PersonNode、PropertyNode、StreetNode,它们继承自TreeNode。TreeNode显示文件夹图标,PersonNode显示用户图

我有一个TreeView组件,它可以包含几种类型的节点。除了我有多个层次化的数据模板外,它都工作得很好。这些模板只在它们显示的字形图像、数据类型和项目资源上有所不同,但其他一切都完全相同

我想知道,是否可以为所有分层数据模板创建一个ControlTemplate,并使用tag属性修改图标图像

例如,我有基本的TreeNode类和节点,比如PersonNode、PropertyNode、StreetNode,它们继承自TreeNode。TreeNode显示文件夹图标,PersonNode显示用户图标,PropertyNode显示房屋图标,StreeNode显示街道图标。 所以,实际上它们都有相同的内容结构,除了图标、数据类型和ItemsSource都在变化

如何简化分层数据模板

示例代码:

 <HierarchicalDataTemplate
    DataType="{x:Type MyTreeFolder:TreeNode}"
    ItemsSource="{Binding Path=Items}">
    
    <StackPanel Orientation="Horizontal">
        <StackPanel.Style>
            <Style TargetType="StackPanel">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsSpecialNode}" Value="True">
                        <Setter Property="Background" Value="Blue"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </StackPanel.Style>

        <glyphs:GlyphAwesome 
            FontSize="12"
            Glyph="folder"
            Margin="0, 0, 4, 0"
            VerticalAlignment="Center"/>

        <TextBlock Text="{Binding}" VerticalAlignment="Center"/>
                
    </StackPanel>
    
</HierarchicalDataTemplate>

您可以创建一个值转换器,用于检查树节点的类型并返回字形文本。类型到glyph文本的映射可以存储在字典中

public class ObjectTypeToGlyphConverter : IValueConverter
{
   private static readonly IDictionary<Type, string> TypeToGlyphMapping = new Dictionary<Type, string>
   {
      [typeof(TreeNode)] = "folder",
      [typeof(PersonNode)] = "person",
      [typeof(PropertyNode)] = "property"
   };

   public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
   {
      var type = value?.GetType();
      return type != null && TypeToGlyphMapping.TryGetValue(type, out var glyph) ? glyph : null;
   }

   public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      throw new InvalidOperationException();
   }
}

在这种情况下,对于类型
TreeNode
,您只需要一个数据模板,因为正如您所说,所有节点类型基本相同,并且除了图标之外,没有对它们进行特殊处理。

您能显示一个数据模板吗?在你的节点类型中,图像是在哪里定义的,用XAML?@thatguy我添加了示例模板,但我能用普通用户控件实现吗?@thatguy所以删除这个问题,没有可行的解决方案?这个问题有解决方案。你从哪里得到的
glyph
?@那家伙是最大的问题,glyph?这是一个我们用来绘制矢量图标而不是使用位图图像的库。
<TreeView ItemsSource="{Binding TreeNodes}">
   <TreeView.Resources>
      <local:ObjectTypeToGlyphConverter x:Key="ObjectTypeToGlyphConverter"/>
   </TreeView.Resources>
   <!-- ...tree view definitions. -->
</TreeView>
<glyphs:GlyphAwesome FontSize="12"
                     Glyph="{Binding Converter={StaticResource ObjectTypeToGlyphConverter}}"
                     Margin="0, 0, 4, 0"
                     VerticalAlignment="Center"/>