2009-02-27 5 views
3

J'ai deux arbres:Pourquoi e.Source dépend de la méthode de peuplement TreeView?

  1. fooTree - composée d'éléments,
  2. barTree - construit par

Les deux arbres ont MouseRightButtonDown événement, mais le type de e.Source diffère:

  1. fooTree - System.Windows.Controls.TreeViewItem
  2. barTree - Système.Windows.Controls .TreeView

Pourquoi la source électronique est-elle différente? Aussi, comment puis-je obtenir l'élément cliqué pour le barTree?

Markup:

<TreeView Name="fooTree" MouseRightButtonDown="fooTree_MouseDown"> 
     <TreeViewItem Header="foo"></TreeViewItem> 
     <TreeViewItem Header="foo"></TreeViewItem> 
    </TreeView> 

    <TreeView Name="barTree" MouseRightButtonDown="barTree_MouseDown" ItemsSource="{Binding BarItems}"> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate> 
       <TextBlock Text="{Binding}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 

code:

public partial class Window1 : Window 
{ 
    public Window1() 
    { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public string[] BarItems 
    { 
     get { return new string[] { "bar", "bar" }; } 
    } 

    private void barTree_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
    } 

    private void fooTree_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
    } 
} 

Répondre

8

Je ne sais pas pourquoi cela se produit, mais au moins j'ai trouvé une solution:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/f0d3af69-6ecc-4ddb-9526-588b72d5196b/

  1. Si votre gestionnaire est sur TreeView, utilisez la propriété OriginalSource dans les arguments d'événement et parcourez la chaîne parentale visuelle jusqu'à ce que vous trouviez un TreeViewItem. Ensuite, sélectionnez-le. Vous pouvez parcourir la chaîne parentale visuelle à l'aide de System.Windows.Media.VisualTreeHelper.GetParent.

  2. Vous pouvez essayer d'enregistrer un gestionnaire de classe pour le type TreeViewItem et l'événement de souris à . Ensuite, votre gestionnaire ne doit être appelé que lorsque les événements de la souris passent à travers les éléments TreeViewItem .

  3. Vous pouvez enregistrer un gestionnaire de classe pour le type TreeViewItem et l'événement d'ouverture de menu contextuel .

donc mon code est:

private void OnMouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeViewItem treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem; 
} 

static DependencyObject VisualUpwardSearch<T>(DependencyObject source) 
{ 
    while (source != null && source.GetType() != typeof(T)) 
     source = VisualTreeHelper.GetParent(source); 

    return source; 
} 
+0

+1 pour une excellente solution. –

1

Vous pouvez obtenir l'élément cliqué dans le bartree en utilisant:

((e.Source) as TreeView).SelectedValue 

Mais sachez que l'élément doit effectivement sélectionné en premier (en utilisant leftMouse). L'article est pas sélectionné immédiatement à l'aide RIGHTMOUSE ...

Questions connexes