【问题标题】:foreach Loop with TreeViewItems带有 TreeViewItems 的 foreach 循环
【发布时间】:2018-07-05 03:07:22
【问题描述】:

我有一些代码被要求从 Windows 窗体转换为 WPF 项目。我遇到的一件事是 TreeNodes 不同。

这是原始窗体代码。

private void CreateTagTree()
{
    StringBuilder sb = new StringBuilder();
   
    // get list of plc program tags
    ABLink.Program plcProgram = myPLC.ProgramList[0];

    string[] plcInfo = (string[])cpuInfo.Value;
    sb.Append(plcInfo[0]+Environment.NewLine).Append(plcInfo[1] + Environment.NewLine).Append("Mode: " + plcInfo[2] + Environment.NewLine).Append("Status: " + plcInfo[3]);

    rootNode.Nodes.Clear();
    rootNode.Text = plcProgram.Name;
    rootNode.ToolTipText = sb.ToString();
    
    // add root node
    treeView1.Nodes.Add(rootNode);

    // get list of plc tag items
    ReadOnlyCollection<TagTemplate> DataTableList = plcProgram.TagItems();

    // create a node for each tag Template
    foreach (TagTemplate tagTemplate in DataTableList)
    {
        TreeNode tagNode = new TreeNode(tagTemplate.Name);
        tagNode.Tag = tagTemplate;
        AddNode(rootNode, tagTemplate);
    }         

}
////////
// adds a tag node to tree
private void AddNode(TreeNode parent, ABLink.TagTemplate template)
{
    TreeNode node = new TreeNode(template.Name);
    parent.Nodes.Add(node);

    // attache template to node
    node.Tag = template;
    node.ToolTipText = template.TypeName;

    ReadOnlyCollection<TagTemplate> memberList = template.Members;

    // if template has members
    foreach (ABLink.TagTemplate member in memberList)
        AddNode(node, member);
}

上面的例子效果很好,没有问题。但是尝试升级这个程序以获得更多的空间来扩展它。

这是我目前所拥有的,它没有正确显示树视图。它留下了很多空白项,我不知道为什么。

private void CreateTagTree()
{
    if (PLC5Radio.IsChecked == true)
    {

    //treeview1.Items.Add(rootNode);
    StringBuilder sb = new StringBuilder();

    // get list of plc program tags
    ABLink.Program plcProgram = myPLC.ProgramList[0];

    string[] plcInfo = (string[])cpuInfoAB.Value;
    sb.Append(plcInfo[0] + Environment.NewLine).Append(plcInfo[1] + Environment.NewLine).Append("Mode: " + plcInfo[2] + Environment.NewLine).Append("Status: " + plcInfo[3]);

    rootNode.Items.Clear();
    rootNode.Header = plcProgram.Name;
    rootNode.ToolTip = sb.ToString();

    // add root node
    //treeview1.Items.Add(rootNode);

    TreeViewItem prgNode = new TreeViewItem
    {
        Header = plcProgram.Name
    };
    
    //// get list of plc tag items
    ReadOnlyCollection<ABLink.TagTemplate> DataTableList = plcProgram.TagItems();

    // get collection of TagItems in 
    // filters "*" returns all tag names & atomic types
    tagListAB = plcProgram.TagItems(filtrName.Text, filterType.Text);

    // create a node for each tagTemplate
    foreach (ABLink.TagTemplate tagTemplate in tagListAB)
    {
        TreeViewItem tagNode = new TreeViewItem();
        tagNode.Items.Add(tagTemplate.Name);
        rootNode.Tag = tagTemplate;
        AddNodeAB(rootNode, tagTemplate);
    }
}
private void AddNodeAB(TreeViewItem parent, ABLink.TagTemplate template)
{
    TreeViewItem node = new TreeViewItem();
    node.Items.Add(template.Name);
    parent.Items.Add(node);

    // attache template to node
    node.Tag = template;
    node.ToolTip = template.TypeName;

    ReadOnlyCollection<ABLink.TagTemplate> memberList = template.Members;

    // if template has members
    foreach (ABLink.TagTemplate member in memberList)
        AddNodeAB(node, member);
}

这是我目前得到的图像。工作程序在右边;我的非工作程序在左侧,添加了额外的空格。

我认为部分问题与此有关

TreeNode tagNode = new TreeNode(tagTemplate.Name);

但是随着 WPF 的变化,我不确定纠正它的最佳方法。任何关于做什么的建议都会有所帮助。

【问题讨论】:

    标签: c# wpf treeview


    【解决方案1】:

    在 WinForms 中

    TreeNode tagNode = new TreeNode(tagTemplate.Name);
    

    创建一个 TreeNode 并设置 Text 值。

    WPF 代码

    TreeViewItem tagNode = new TreeViewItem();
    tagNode.Items.Add(tagTemplate.Name);
    

    创建一个空的 TreeViewItem 并添加一个子项。这显然不是等效的操作。

    Text 替换为 Header 属性:

    TreeViewItem tagNode = new TreeViewItem();
    tagNode.Header = tagTemplate.Name;
    tagNode.Tag = tagTemplate;
    

    同样在下一个方法中

    TreeViewItem node = new TreeViewItem();
    node.Header = template.Name;
    parent.Items.Add(node);
    

    Header 具有object 类型并且可以包含任何值,而不仅仅是纯文本,例如另一个控件。请阅读这篇 CodeProject 文章以获取概述:Basic Understanding of Tree View in WPF

    【讨论】:

    • 谢谢!这解决了我一直讨厌它的问题,因为它是如此简单。感谢您的帮助。
    猜你喜欢
    • 2015-06-16
    • 2017-02-28
    • 1970-01-01
    • 2010-11-19
    • 2012-02-16
    • 2014-10-14
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多