C# HierarchycalDataTemplate树视图项不可单击

C# HierarchycalDataTemplate树视图项不可单击,c#,wpf,xaml,treeview,visual-studio-extensions,C#,Wpf,Xaml,Treeview,Visual Studio Extensions,我有下面一段XAML,它创建了一个treeview并用treeview项填充它。 转换器只需取下名称,并用2个不同颜色的字符串吐回StackPanel。 我发现,我可以直观地使用stackpanel的唯一方法是将其设置在TreeViewItem的标题中,但这并不能以最佳方式工作,因为TreeViewItem已经通过编程方式创建 结果是我无法单击labelheader,但它看起来很奇特,但是我发现标签前面有一个很大的空间,我可以单击,这必须来自生成的TreeViewItem。 我真的需要标签包含2

我有下面一段XAML,它创建了一个treeview并用treeview项填充它。 转换器只需取下名称,并用2个不同颜色的字符串吐回StackPanel。 我发现,我可以直观地使用stackpanel的唯一方法是将其设置在TreeViewItem的标题中,但这并不能以最佳方式工作,因为TreeViewItem已经通过编程方式创建

结果是我无法单击labelheader,但它看起来很奇特,但是我发现标签前面有一个很大的空间,我可以单击,这必须来自生成的TreeViewItem。 我真的需要标签包含2个文本块的stackpanel,有解决方案吗

<UserControl.Resources>
        <XmlDataProvider x:Key="MyXmlProvider" Source="LogansTest.xml" XPath="/Items"/>
        <customScripts:NameGeneration x:Key="NameGeneration"/>
        <HierarchicalDataTemplate x:Key="NodeTemplate" ItemsSource="{Binding XPath=./*}">
            <TreeViewItem x:Name="nodetext"/>

            <HierarchicalDataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                    <Setter TargetName="nodetext" Property="Header" Value="{Binding Converter={StaticResource NameGeneration}}"/>
                </DataTrigger>
            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>
    </UserControl.Resources>
顺便说一下,整个GIT回购协议可以在这里找到:

您不应该在HierarchycalDataTemplate中创建另一个TreeViewItem容器。尝试定义设置标头属性的ItemContainerStyle:

<TreeView ItemsSource="{Binding Source={StaticResource MyXmlProvider}}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding XPath=./*}" />
    </TreeView.ItemTemplate>
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                    <Setter Property="Header" Value="{Binding Converter={StaticResource NameGeneration}}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

多亏了@mm8,我终于找到了答案,当我找到答案的时候,答案真的很简单,这花了我太长时间。 我没有将StackPanel设置为treeviewitem头,而是用XAML构建了StackPanel,并在那里一次设置一个值,瞧,它成功了

<UserControl x:Class="XmlOutline.OutlineWindowControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:vsshell="clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.15.0"
             xmlns:customScripts="clr-namespace:XmlOutline.CustomScripts"
             Background="{DynamicResource {x:Static vsshell:VsBrushes.WindowKey}}"
             Foreground="{DynamicResource {x:Static vsshell:VsBrushes.WindowTextKey}}"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300"
             Name="MyToolWindow">
    <UserControl.Resources>
        <XmlDataProvider x:Key="MyXmlProvider" Source="LogansTest.xml" XPath="/Items"/>
        <customScripts:NameGeneration x:Key="NameGeneration"/>
    </UserControl.Resources>

    <Grid x:Name="TreeGrid" DataContext="MyXmlProvider">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TreeView Name="TreeItems" Visibility="Hidden"
                  ItemsSource="{Binding}"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  VirtualizingStackPanel.IsVirtualizing="False"
                  VirtualizingStackPanel.VirtualizationMode="Standard"
                  Background="#252525"
                  SelectedItemChanged="TreeView_OnSelectedItemChanged"
                  TreeViewItem.Expanded="TreeViewItem_Expanded"
                  TreeViewItem.Collapsed="TreeViewItem_Collapsed">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate x:Name="myTest" ItemsSource="{Binding XPath=./*}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock x:Name="Title"    Foreground="LightSkyBlue" FontSize="14"/>
                        <TextBlock x:Name="SubTitle" Foreground="YellowGreen"  FontSize="13"/>
                    </StackPanel>
                    <HierarchicalDataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                            <Setter TargetName="Title" Property="Text"  Value="{Binding Path=Name}"/>
                            <Setter TargetName="SubTitle" Property="Text" Value="{Binding Converter={StaticResource NameGeneration}}" />
                        </DataTrigger>
                    </HierarchicalDataTemplate.Triggers>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</UserControl>

我知道有一个非常类似的问题,但它要求一个非常不同的解决方案,这不适用于我的情况!:我发现,如果我将ItemSource设置为just Binding,它将遍历节点并创建treeviewitems,它还将运行转换器以使line也能工作,但它不会将文本值分配给标头。你的建议似乎很合理,但我似乎把实现搞砸了,我已经用整个XAML块更新了上面的帖子,以防万一:@TheLogan:在哪里可以找到重现您的问题所需的LogansTest.xml文件?啊,对不起,这实际上只是一个不存在的伪值,我添加了,在我的代码中,每当用户打开一个新的xml文档时,我就会分配一个新的提供者。编辑我也将代码移到了主帖子中,在加载窗口的那一刻,我隐藏了树,直到一个XML文档处于活动状态,而只是显示一个背景徽标。
<TreeView ItemsSource="{Binding Source={StaticResource MyXmlProvider}}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding XPath=./*}" />
    </TreeView.ItemTemplate>
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                    <Setter Property="Header" Value="{Binding Converter={StaticResource NameGeneration}}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>
<UserControl x:Class="XmlOutline.OutlineWindowControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:vsshell="clr-namespace:Microsoft.VisualStudio.Shell;assembly=Microsoft.VisualStudio.Shell.15.0"
             xmlns:customScripts="clr-namespace:XmlOutline.CustomScripts"
             Background="{DynamicResource {x:Static vsshell:VsBrushes.WindowKey}}"
             Foreground="{DynamicResource {x:Static vsshell:VsBrushes.WindowTextKey}}"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300"
             Name="MyToolWindow">
    <UserControl.Resources>
        <XmlDataProvider x:Key="MyXmlProvider" Source="LogansTest.xml" XPath="/Items"/>
        <customScripts:NameGeneration x:Key="NameGeneration"/>
    </UserControl.Resources>

    <Grid x:Name="TreeGrid" DataContext="MyXmlProvider">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TreeView Name="TreeItems" Visibility="Hidden"
                  ItemsSource="{Binding}"
                  HorizontalAlignment="Stretch"
                  VerticalAlignment="Stretch"
                  VirtualizingStackPanel.IsVirtualizing="False"
                  VirtualizingStackPanel.VirtualizationMode="Standard"
                  Background="#252525"
                  SelectedItemChanged="TreeView_OnSelectedItemChanged"
                  TreeViewItem.Expanded="TreeViewItem_Expanded"
                  TreeViewItem.Collapsed="TreeViewItem_Collapsed">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate x:Name="myTest" ItemsSource="{Binding XPath=./*}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock x:Name="Title"    Foreground="LightSkyBlue" FontSize="14"/>
                        <TextBlock x:Name="SubTitle" Foreground="YellowGreen"  FontSize="13"/>
                    </StackPanel>
                    <HierarchicalDataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
                            <Setter TargetName="Title" Property="Text"  Value="{Binding Path=Name}"/>
                            <Setter TargetName="SubTitle" Property="Text" Value="{Binding Converter={StaticResource NameGeneration}}" />
                        </DataTrigger>
                    </HierarchicalDataTemplate.Triggers>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</UserControl>