查找已在对象WPF上为事件分配的事件处理程序

时间:2012-12-11 09:27:48

标签: c# wpf event-handling

  

可能重复:
  Has an event handler already been added?

首先我知道有很多类似的问题,但我无法适应我的情况。

我希望能够找出为对象上的特定事件分配的事件处理程序。所以在treeviewitem上,我将为扩展事件分配一个处理程序。然后我会在以后想要将指定的事件处理程序拉出并将其分配给另一个treeviewitems展开的事件,以便它们在扩展事件上调用相同的处理程序。

这可能吗?

继承人我想做的事情......

private void duplicateHandler( TreeViewItem existingItem )
{
    TreeViewItem tvi = new GX3TreeViewItem();

    tvi.AddHandler(TreeViewItem.ExpandedEvent, existingItem.ExpandedEventHandler);
}

2 个答案:

答案 0 :(得分:3)

  1. 创建一个新的WPF应用
  2. 在主窗口中放置一个名为“tree1”的树视图
  3. 复制粘贴后面的代码以查看其实际操作
  4. 基本上,您需要继承TreeViewItem并构建一种机制来跟踪哪些处理程序被添加到哪个节点:event不包含有关您要检索的注册处理程序的信息。“ / p>

    您还需要完全依赖新的继承来构建节点,以便正常工作。这意味着,您必须不再引用TreeViewItem,但必须引用TreeNode(这是我为自定义类选择的名称,随时可以更改它。)

    承诺的代码在下面,它的作用是向树中添加一个“rootNode”节点,在扩展时会创建一个兄弟节点,这个节点会将相同的处理程序带到自身(因此它也会创建一个兄弟节点)扩张,等等。)

    namespace WpfApplication1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                TreeNode root = new TreeNode();
                root.Header = "root";
    
                tree1.Items.Clear();
    
                // add node to tree before adding handlers, or you'll get
                // a StackOverflowException
                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!";
    
                // add node to tree before adding handlers, or you'll get
                // a StackOverflowException
                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;
            }
        }
    }
    

答案 1 :(得分:-1)

确定可以,您可以浏览代码,直到找到事件分配:

event +=  myEventHandler

然后,您可以使用相同的方法myEventHandler来订阅其他树上的事件。这是问题还是我误解了这个问题?