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