WPF

2012-12-11 2 views
2

가능한 중복 :
Has an event handler already been added?WPF

은 첫째로 나는에 simmilar 질문의 숫자가 알고하지만 난 문제가 있어요 내 상황에 적응시키는 것.

어떤 이벤트 처리기가 개체의 paticular 이벤트에 할당되어 있는지 확인할 수 있기를 바랍니다. 그래서 treeviewitem에, 나는 확장 이벤트에 대한 핸들러를 할당 할 것이다. 나중에 할당 된 이벤트 핸들러를 꺼내서 다른 treeviewitems 확장 이벤트에 할당하여 둘 다 확장 이벤트에서 동일한 핸들러를 호출 할 수있게하려는 것입니다.

이것이 가능합니까?

event += myEventHandler 

당신은 할 수 있습니다 : 당신이 이벤트 할당을 찾을 때까지 당신은, 당신은 당신의 코드를 탐색 할 수 있습니다 Heres는 내가 할 수 있기를 원하는

...

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

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

나는 그것에 대해 질문을했지만. 그 방법은 어느 수업에 들어갈 수 있습니까? 확장 된 treeviewitem 클래스? 그렇다면 어떻게 할당 된 확장 처리기를 얻을 수 있습니까? – user589195

답변

2
  1. 새로운 WPF 응용 프로그램을 만들
  2. 이 MainWindow를에서 "트리 1"이라는 트 리뷰를 넣어
  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; 
     } 
    } 
} 
+0

고맙습니다. :) – user589195

-1

예 확인 그런 다음 동일한 방법 myEventHandler을 사용하여 다른 트리에서 이벤트를 구독하십시오. 이것이 문제입니까, 아니면 제가 그 질문을 오해하고 있습니까?

+1

약간의 오해가 있습니다. 런타임시 treeviewitem을 검사하고 확장 된 이벤트 핸들러에 대한 참조를 얻을 수 있어야합니다. – user589195

+0

참조는 이벤트 자체이므로 더 나은 내용을 이해하기 위해 코드를 붙여주십시오 –

+0

업데이트 된 질문. 더 이상 정보가 필요하면 알려주세요 :) – user589195