【问题标题】:Reverse winforms treeview expanding nodes upwards反向winforms treeview向上扩展节点
【发布时间】:2019-05-19 01:50:50
【问题描述】:

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

【问题讨论】:

  • 您可以在 WPF 中创建这样的 UI(底部有节点)。看看this post
  • 感谢 Reza,但我需要在传统的 Winforms 项目中使用它
  • 您可以使用 ElementHost 控件在 Windows 窗体中托管 WPF 控件。您可以看到一个example,它显示您创建一个托管 WPF 控件的 Windows 窗体用户控件。

标签: c# .net winforms treeview


【解决方案1】:

作为一种选择,您可以依靠ElementHost Windows 窗体控件在其中托管 WPF TreeView 控件。然后对于 WPF TreeView 及其节点,将 RotateTransform 设置为 180 度。

示例

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

这里是代码。只需将代码作为类添加到您的应用程序中,并确保您已经添加了文章末尾提到的所需程序集。然后构建项目并将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 属性中所做的更改不会在设计时立即反映,而是会被序列化并在运行时显示。

【讨论】:

    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    相关资源
    最近更新 更多