3

重複の可能性:
イベントハンドラーはすでに追加されていますか?

まず、似たような質問がたくさんあることは知っていますが、自分の状況にそれらを適応させるのに苦労しています。

オブジェクトの特定のイベントに割り当てられているイベントハンドラーを確認できるようにしたいと思います。したがって、treeviewitemで、展開されたイベントのハンドラーを割り当てます。その後、割り当てられたイベントハンドラーを引き出して、それを別のtreeviewitems拡張イベントに割り当てて、両方が拡張イベントで同じハンドラーを呼び出すことができるようにしたいと思います。

これは可能ですか?

これが私がしたいことです...

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

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

2 に答える 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;
        }
    }
}
于 2012-12-11T10:29:59.683 に答える
-1

はい、できます。イベントの割り当てが見つかるまで、コードをナビゲートできます。

event +=  myEventHandler

その後、同じ方法を使用して、myEventHandler他のツリーのイベントをサブスクライブできます。これは問題ですか、それとも質問を誤解していますか?

于 2012-12-11T09:34:53.620 に答える