Обратное древовидное дерево расширяет узлы вверх - PullRequest
0 голосов
/ 18 декабря 2018

Есть ли в любом случае подкласс древовидной структуры Winforms для отображения восходящих узлов корневых узлов, расширяющих узлы вверх?Следующее фотошоп-изображение иллюстрирует желаемый результат:

Standard and reverse Winforms TreeView controls

1 Ответ

0 голосов
/ 18 декабря 2018

Как вариант, вы можете положиться на ElementHost элемент управления Windows Forms для размещения в нем элемента управления WPF TreeView.Затем для WPF TreeView и его узлов установите RotateTransform на 180 градусов.

Пример

В следующем примере я создал Windows Forms UserControl, содержащий ElementHost для размещения элемента управления WPF TreeView и путем установки 180 градусов RotateTransform для дерева и его узлов, я создаю дерево вверх ногами (снизу вверх):

enter image description here

Вот код.Просто добавьте код как класс в ваше приложение и убедитесь, что вы уже добавили необходимые сборки, которые упомянуты в конце поста.Затем создайте проект и поместите экземпляр 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);
    }
}

Ссылочные сборки

Здесь требуются ссылочные сборки: PresentationCore, PresentationFramework, WindowsBase, WindowsFormsIntegration.

Примечание

Для этого примера я использовал TreeNodeCollection.Вы можете использовать любую другую структуру, которая вам нравится.Вы можете добавить узлы в режиме конструктора, используя свойство Nodes и видеть дерево во время выполнения.В качестве известной проблемы для этого примера изменение, внесенное в свойство Nodes, не будет отражаться сразу во время разработки, но будет сериализовано и будет отображаться во время выполнения.

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