Как вариант, вы можете положиться на ElementHost
элемент управления Windows Forms для размещения в нем элемента управления WPF TreeView
.Затем для WPF TreeView
и его узлов установите RotateTransform
на 180 градусов.
Пример
В следующем примере я создал Windows Forms UserControl
, содержащий ElementHost
для размещения элемента управления WPF TreeView
и путем установки 180 градусов RotateTransform
для дерева и его узлов, я создаю дерево вверх ногами (снизу вверх):
![enter image description here](https://i.stack.imgur.com/wlOPG.png)
Вот код.Просто добавьте код как класс в ваше приложение и убедитесь, что вы уже добавили необходимые сборки, которые упомянуты в конце поста.Затем создайте проект и поместите экземпляр 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
, не будет отражаться сразу во время разработки, но будет сериализовано и будет отображаться во время выполнения.