Цикл foreach с TreeViewItems - PullRequest
0 голосов
/ 05 июля 2018

У меня есть код, который меня просят преобразовать из Windows Forms в проект 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 я не уверен, что это лучший способ исправить это. Любой совет о том, что делать, будет полезен.

enter image description here

1 Ответ

0 голосов
/ 05 июля 2018

в WinForms

TreeNode tagNode = new TreeNode(tagTemplate.Name);

создает TreeNode и устанавливает текстовое значение.

WPF код

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

создает пустой TreeViewItem и добавляет дочерний элемент. Это НЕ эквивалентная операция, очевидно.

замена для Текст будет 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, чтобы получить обзор: Основные сведения о древовидном представлении в WPF .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...