反向winforms treeview向上扩展节点

Reverse winforms treeview expanding nodes upwards

是否有子类化 Winforms Treeview 以显示向上扩展节点的根节点上升节点? 以下经过 Photoshop 处理的图片说明了所需的结果:

作为一个选项,您可以依靠 ElementHost Windows Forms 控件在其中承载 WPF TreeView 控件。然后对于 WPF TreeView 及其节点,将 RotateTransform 设置为 180 度。

例子

在下面的示例中,我创建了一个 Windows 表单 UserControl,其中包含一个 ElementHost 来托管 WPF TreeView 控件,并通过设置 180 度 RotateTransform 对于树及其节点,我正在制作一个倒置(自下而上)的树:

这是代码。只需将代码作为 class 添加到您的应用程序中,并确保您已经添加了 post 末尾提到的必需程序集。然后构建项目并将 MyTreeView 的实例拖放到您的表单上。

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.Integration;
using System.Windows.Media;
public class MyTreeView : System.Windows.Forms.UserControl, ISupportInitialize
{
    private ElementHost elementHost = new ElementHost();
    private TreeView tree;
    private System.Windows.Forms.TreeView winFormsTree;
    public MyTreeView()
    {
        tree = new TreeView();
        winFormsTree = new System.Windows.Forms.TreeView();
        Nodes = winFormsTree.Nodes;
        tree.LayoutTransform = new RotateTransform(180);
        tree.FlowDirection = FlowDirection.RightToLeft;
        elementHost.Dock = System.Windows.Forms.DockStyle.Fill;
        elementHost.Name = "elementHost";
        elementHost.Child = tree;
        Controls.Add(elementHost);
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public System.Windows.Forms.TreeNodeCollection Nodes { get; }
    public void BeginInit() { }
    public void RefreshTree()
    {
        tree.Items.Clear();
        RefreshTree(tree.Items, Nodes);
    }
    private void RefreshTree(ItemCollection items, 
        System.Windows.Forms.TreeNodeCollection nodes)
    {
        foreach (System.Windows.Forms.TreeNode node in nodes)
        {
            var item = new TreeViewItem();
            var label = new Label();
            label.LayoutTransform = new RotateTransform(180);
            label.Content = node.Text;
            label.Padding = new Thickness(0);
            item.Header = label;
            items.Add(item);
            RefreshTree(item.Items, node.Nodes);
        }
    }
    public void EndInit()
    {
        RefreshTree();
    }
    protected override void Dispose(bool disposing)
    {
        if (disposing && winFormsTree != null)
            winFormsTree.Dispose();
        base.Dispose(disposing);
    }
}

引用程序集

这里是必需的引用程序集:PresentationCorePresentationFrameworkWindowsBaseWindowsFormsIntegration

备注

对于这个例子,我使用了 TreeNodeCollection。您可以使用您喜欢的任何其他结构。您可以使用 Nodes 属性 在设计模式下添加节点,并在 运行 时查看树。作为此示例的一个已知问题,您在 Nodes 属性 中所做的更改不会在设计时立即反映出来,而是会序列化并在 运行 时显示。