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



可能的重复项:
是否已添加事件处理程序?

首先,我知道有许多类似的问题,但我很难使它们适应我的情况。

我希望能够找出为对象上的paticular 事件分配了哪个事件处理程序。因此,在树视图项上,我将为扩展的事件分配一个处理程序。然后,我希望以后能够将分配的事件处理程序拉出并将其分配给另一个 treeviewitems 展开事件,以便它们都在展开事件上调用相同的处理程序。

这可能吗?

这就是我希望能够做的...

private void duplicateHandler( TreeViewItem existingItem )
{
    TreeViewItem tvi = new GX3TreeViewItem();
    tvi.AddHandler(TreeViewItem.ExpandedEvent, existingItem.ExpandedEventHandler);
}
  1. 创建新的 WPF 应用
  2. 在主窗口中放置一个名为"tree1"的树视图
  3. 复制粘贴下面的代码以查看其运行情况

基本上,您需要继承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();
            // 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;
        }
    }
}

是的,当然可以,您可以浏览代码,直到找到事件分配:

event +=  myEventHandler

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

相关内容

  • 没有找到相关文章

最新更新