- 创建一个新的WPF应用程序
- 在你的主窗口中放置一个名为"tree1"的树形视图
- 复制并粘贴以下代码以查看它的运行效果
基本上,您需要继承TreeViewItem
并建立一种机制来跟踪添加到哪个节点的处理程序:不幸的是,event
没有有关已注册处理程序的信息可供检索。
您还将需要完全依赖于您的新继承来构建节点,以使事情正常工作。这意味着,您不能再引用TreeViewItem
,而必须引用TreeNode
(这是我选择的自定义类的名称,可以随意更改)。
下面是承诺的代码,它会将一个"rootNode"节点添加到树中,在展开时会创建一个兄弟节点,该节点会将相同的处理程序带到自己身上(因此它也会在展开时创建一个兄弟节点,以此类推)。
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TreeNode root = new TreeNode();
root.Header = "root";
tree1.Items.Clear();
tree1.Items.Add(root);
root.AddHandler(TreeNode.ExpandedEvent, new RoutedEventHandler(expandedHandler));
}
private void expandedHandler(object sender, RoutedEventArgs e) { newNodeCopyExpandedHandlers(sender as TreeNode); }
private void newNodeCopyExpandedHandlers(TreeNode node)
{
TreeNode newNode = new TreeNode();
newNode.Header = "nuovo!";
tree1.Items.Add(newNode);
foreach (Delegate d in newNode.GetHandlers(node, TreeNode.ExpandedEvent))
newNode.AddHandler(TreeNode.ExpandedEvent, d);
}
}
public class TreeNode : TreeViewItem
{
private Dictionary<RoutedEvent, List<Delegate>> handlersList = new Dictionary<RoutedEvent, List<Delegate>>();
public new void AddHandler(RoutedEvent e, Delegate d)
{
if (!handlersList.ContainsKey(e)) handlersList.Add(e, new List<Delegate>());
handlersList[e].Add(d);
base.AddHandler(e, d);
}
public new void RemoveHandler(RoutedEvent e, Delegate d)
{
if (!handlersList.ContainsKey(e)) handlersList.Add(e, new List<Delegate>());
if (handlersList[e].Contains(d)) handlersList[e].Remove(d);
base.RemoveHandler(e, d);
}
public List<Delegate> GetHandlers(TreeNode n, RoutedEvent e)
{
if (n.handlersList.ContainsKey(e)) return n.handlersList[e];
else return null;
}
}
}