反向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);
}
}
引用程序集
这里是必需的引用程序集:PresentationCore
、PresentationFramework
、WindowsBase
、WindowsFormsIntegration
。
备注
对于这个例子,我使用了 TreeNodeCollection
。您可以使用您喜欢的任何其他结构。您可以使用 Nodes
属性 在设计模式下添加节点,并在 运行 时查看树。作为此示例的一个已知问题,您在 Nodes
属性 中所做的更改不会在设计时立即反映出来,而是会序列化并在 运行 时显示。
是否有子类化 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);
}
}
引用程序集
这里是必需的引用程序集:PresentationCore
、PresentationFramework
、WindowsBase
、WindowsFormsIntegration
。
备注
对于这个例子,我使用了 TreeNodeCollection
。您可以使用您喜欢的任何其他结构。您可以使用 Nodes
属性 在设计模式下添加节点,并在 运行 时查看树。作为此示例的一个已知问题,您在 Nodes
属性 中所做的更改不会在设计时立即反映出来,而是会序列化并在 运行 时显示。