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

3

可能是重复问题:
已经添加了事件处理程序吗?

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

我想要能够找出在对象上分配给特定事件的事件处理程序。因此,在一个树形视图项上,我将为展开事件分配一个处理程序。然后,在以后的某个日期,我希望能够提取已分配的事件处理程序,并将其分配给另一个树形视图项的展开事件,使它们都调用相同的展开事件处理程序。

这可行吗?

这是我想要能够做到的...

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

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

我已经看过了,但是有一些问题。那个方法应该放在哪个类中?扩展的TreeViewItem类吗?如果是,那么我如何获取分配的扩展处理程序? - user589195
2个回答

3
  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;
        }
    }
}

-1

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

event +=  myEventHandler

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


1
您有些误解,我需要在运行时检查树形视图项,并获取其展开事件处理程序的引用。 - user589195
参考是事件本身,请粘贴一些代码以更好地理解。 - Tobia Zambon
更新的问题。如果您需要更多信息,请告诉我 :) - user589195
很奇怪,TreeNodes 没有事件...你是否已经创建了具有事件的自定义树节点? - Tobia Zambon
我已经创建了但还没有添加任何事件。这个问题涉及到WPF而不是WinForms。不确定WinForms的树节点是否有事件。 - user589195
啊,好的,我已经重新标记了你的问题,抱歉但是我不懂WPF...我无法帮助你。 - Tobia Zambon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接