【发布时间】:2020-01-08 19:18:05
【问题描述】:
我正在尝试通过在代码中创建并添加我的TreeViewItems 来构建TreeView。我有一个Folders 的对象,其中包含一个子文件夹列表和一个Sessions 列表。所有这些都保存在Root 文件夹对象中。当我使用递归创建TreeViewItems 并将它们添加到我的TreeView 时,会出现根文件夹中的Folders 和Sessions,但不会显示属于其集合的TreViewItems。
当我手动为页面写出 xaml 时,它会根据需要显示,但在添加代码时不会显示。我在调试器中查看了TreeView 对象,我可以在Items 集合中看到TreeViewItems 的第二层和第三层,但它们都没有显示。
我的对象
[Serializable]
public class Session
{
public int Id { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public Protocol ConnectionProtocol { get; set; }
public int Port { get; set; }
}
[Serializable]
public class Folder
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual int ParentID { get; set; }
public virtual List<Folder> SubFolders { get; set; } = new List<Folder>();
public virtual List<Session> Sessions { get; set; } = new List<Session>();
}
[Serializable]
public class Root : Folder
{
public KeyValuePair<ulong, int> Version
{
get
{
return new KeyValuePair<ulong, int>(_revisionNumber, GetHashCode());
}
}
private ulong _revisionNumber = 0;
public override int Id { get => 0; set { } }
public override int ParentID { get => 0; set { } }
private void UpdateVersion()...
public bool AddSession(Session session)...
public bool RemoveSession(Session session)...
public bool AddFolder(Folder folder)...
public bool RemoveFolder(Folder folder)...
}
在主窗口中
private static Root root { get; set; }
private void RefreshTree()
{
SessionsTree.Items.Clear();
foreach (var sub in root.SubFolders)
SessionsTree.Items.Add(GetNodesFromFolder(sub));
foreach (var session in root.Sessions)
SessionsTree.Items.Add(BuildTreeViewItem(session));
SessionsTree.UpdateLayout();
}
private TreeViewItem GetNodesFromFolder(Folder folder)
{
TreeViewItem viewItem = BuildTreeViewItem(folder);
foreach (var sub in folder.SubFolders)
viewItem.Items.Add(GetNodesFromFolder(sub));
foreach (var session in folder.Sessions)
viewItem.Items.Add(BuildTreeViewItem(session));
return viewItem;
}
private TreeViewItem BuildTreeViewItem(Folder folder)
{
TreeViewItem viewItem = new TreeViewItem();
viewItem.Tag = folder;
viewItem.Height = 14;
Image image = new Image();
image.Source = FolderImage;
image.Height = 14;
TextBlock textBlock = new TextBlock();
textBlock.Text = folder.Name;
StackPanel stackPanel = new StackPanel();
stackPanel.Orientation = Orientation.Horizontal;
stackPanel.Children.Add(image);
stackPanel.Children.Add(textBlock);
viewItem.Header = stackPanel;
return viewItem;
}
private object BuildTreeViewItem(Session session)
{
TreeViewItem viewItem = new TreeViewItem();
viewItem.Tag = session;
Image image = new Image();
image.Source = SwitchBlue;
image.Height = 14;
TextBlock textBlock = new TextBlock();
textBlock.Text = session.Name;
textBlock.Margin = new Thickness(4, 0, 0, 0);
StackPanel stackPanel = new StackPanel();
stackPanel.Orientation = Orientation.Horizontal;
stackPanel.Children.Add(image);
stackPanel.Children.Add(textBlock);
viewItem.Header = stackPanel;
return viewItem;
}
我希望一棵树显示为......
v {} Folder 1
v {} SubFolder 1
[] Session
[] Session
> {} SubFolder 2
[] Session
> {} SubFolder 3
> {} Folder 2
> {} Folder 3
[] Session
[] Session
[] Session
但我得到的是
v {} Folder 1
v {} Folder 2
v {} Folder 3
[] Session
[] Session
[] Session
【问题讨论】:
-
如果您使用的是 WPF,那么为什么要在后面的代码中创建控件?该控件应创建为 XAML。您构建 TreeView 的方法是完全错误的。