为什么我的WPF TreeView项看起来像这样?

时间:2010-10-22 14:38:04

标签: .net wpf layout treeview

在学习WPF时,我(可能是不明智的)选择在TreeView中显示我的XML数据(用LINQ明智地解析)。但是当我将它加载到TreeView中时,它看起来像这样:

alt text

XAML如下:

<TreeView Name="StoryTree">
    <TreeViewItem Name="TreeGeneral" Header="General"/>
    <TreeViewItem Name="TreeCharacters" Header="Characters" />
    <TreeViewItem Name="TreeEvents" Header="Events" />
    <TreeViewItem Name="TreeFactions" Header="Factions" />
    <TreeViewItem Name="TreeLocations" Header="Locations" />
    <TreeViewItem Name="TreePlots" Header="Plots" />
    <TreeViewItem Name="TreeReferences" Header="References" />
    <TreeViewItem Name="TreeScenes" Header="Scenes" />
</TreeView>

在代码隐藏中,我使用一个简单的例程将项目加载到树视图中,如下所示:

    private void Update(StoryItem[] items, TreeViewItem parentNode)
    {
        //  Suppress updating if there are no actual changes.
        if (Changed(items, parentNode))
        {

            //  Remove all items from the child node.
            ClearItem(parentNode);

            //  Reinsert the child nodes.
            foreach (var item in items)
            {
                //  Create a TreeViewItem and insert it into the TreeView.
                //  Note that the item must support double clicking so that the 
                //  user can open the item. Also, we want to support tooltips
                //  for the items so that the summary text (if any) will display
                //  when the user hovers over the item with the mouse.
                TreeViewItem treeItem = new TreeViewItem();
                TextBlock block = new TextBlock();
                block.Text = item.Name;
                block.ToolTip = item.Summary;
                block.TextTrimming = TextTrimming.WordEllipsis;
                treeItem.Items.Add(block);
                parentNode.Items.Add(treeItem);
            }
        }
    }

我有点怀疑这是WPF中的“级联样式继承”,但我不完全确定(顶级节点看起来很好),但它可能与我创建子项的方式有关节点。

声明: 请不要深入研究绑定树视图的讨论。对于此特定应用,数据 NEVER 将包含多个类别标题(顶级节点)和紧接其下方的项目。我想知道的是为什么顶级节点看起来很好,我创建的节点与它们不同。

我已经尝试消除TreeViewItem和margin&amp;的填充。在TextBlock上填充,两者都无济于事。

(Visual STudio 2008 SP1,.NET 3.5,Win7)

2 个答案:

答案 0 :(得分:2)

我认为这是因为您将孩子添加到另一个(冗余)树项目中。由于该树项只包含一个子项而没有标题,因此您需要在树中获得需要展开的额外级别。

尝试以下方法:

        foreach (var item in items)
        {
            //  Create a TreeViewItem and insert it into the TreeView.
            //  Note that the item must support double clicking so that the 
            //  user can open the item. Also, we want to support tooltips
            //  for the items so that the summary text (if any) will display
            //  when the user hovers over the item with the mouse.

            TreeViewItem child = new TreeViewItem();
            child.Header = item.Name;
            child.ToolTip = item.Summary;

            parentNode.Items.Add(block);
        }

答案 1 :(得分:2)

试试这个      删除TextBlock block = new TextBlock();

        foreach (var item in items)
        {
            TreeViewItem treeItem = new TreeViewItem();
            treeItem .Header = item.Name;
            treeItem .ToolTip = item.Summary;                    
            parentNode.Items.Add(treeItem);
        }

这对我有用。