2009-08-21 10 views
4

J'ai un TreeView qui lance une nouvelle fenêtre lorsque chacun de son événement TreeViewItems Selected est déclenché.Parent TreeView Élément événement fantôme sélectionné!

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" 
    Height="300" 
    Width="300"> 
<Grid> 
    <TreeView Name="treeView1"> 
     <TreeViewItem Header="Root"> 
      <TreeViewItem Header="Parent" Selected="ParentTreeViewItem_Selected"> 
       <TreeViewItem Header="Child" Selected="TreeViewItem_Selected" ></TreeViewItem> 
      </TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 
</Grid> 
</Window> 

code Derrière

namespace WpfApplication1 

{ public partial class Window1: Fenêtre { publique Window1() { InitializeComponent(); }

private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 
     Window w = new Window(); 
     w.Show(); 
     e.Handled = true; 
    } 

    private void ParentTreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 

    } 
} 

}

Lorsque je clique sur le nœud enfant de la nouvelle fenêtre est lancée comme prévu. Cependant, imédiatement après ses parents, l'événement sélectionné est déclenché en volant le focus de la nouvelle fenêtre, et en marquant le nœud parent comme la sélection actuelle!

Je m'attendais à ce que la fenêtre nouvellement lancée soit mise au point, et le nœud sur lequel on cliquait deviendrait gris en indiquant à l'utilisateur sa sélection. Est-ce que quelqu'un a une idée de pourquoi cela arrive et comment je peux l'empêcher?

Merci, Brette

Répondre

2

Je pensais que je posterais la réponse. J'ai finalement trouvé un moyen de contourner cela. Réglage w.Owner = ceci; n'a aucun effet. Il s'avère que le lancement d'une nouvelle fenêtre sur l'événement Selected d'un TreeViewItem provoque des problèmes de focus. Je n'ai pas découvert quelle est la cause première en exécutant ceci sur le Dispatcher semble le corriger. Voir ci-dessous

private void ChildTreeViewItem_Selected(object sender, RoutedEventArgs e) 
    { 
     Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => new Window().Show())); 
    } 

Espérons que cela sauve quelqu'un d'autre.

Brette

+0

J'ai trouvé le même problème lors du lancement de ce IsSelected setter de la propriété du ViewModel. De là, vous ne pouvez pas utiliser Dispatcher, donc j'utilise cette solution: http://stackoverflow.com/a/5971732/383129 – JoanComasFdz

0

Ajouter:

w.Owner = this  

Exemple:

private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
{ 
    Window w = new Window(); 
    w.Owner = this; 
    w.Show(); 
    e.Handled = true; 
} 
Questions connexes