2012-12-27 14 views
5

Ho un TreeView WPF con XAML illustrato di seguito:WPF TreeView ripristina la sua attenzione dopo aver fatto doppio clic

<TreeView x:Name="twElements"> 
      <TreeView.Resources> 
       <v8r:IconTypeConverter x:Key="IconConverter"/> 
      </TreeView.Resources> 

      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <EventSetter Event="MouseDoubleClick" Handler="twElements_MouseDoubleClick" /> 
       </Style> 
      </TreeView.ItemContainerStyle> 

      <TreeView.ItemTemplate> 
       <HierarchicalDataTemplate ItemsSource="{Binding ChildItems}"> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="{Binding Icon, Converter={StaticResource IconConverter}}"/> 
         <TextBlock Text="{Binding Text}" Margin="3,0,0,0"/> 
        </StackPanel> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 

Il compito è quello di aprire una qualche forma dopo aver fatto doppio clic su un elemento figlio.

code-behind per evento DoubleClick:

private void twElements_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
     { 
      if (e.Source is TreeViewItem && ((TreeViewItem)e.Source).IsSelected) 
      { 
       e.Handled = true; 

       var twi = (TreeViewItem)e.Source; 

       var Editable = twi.Header as IEditable; 
       if (Editable != null) 
       { 

        Window Editor = Editable.GetEditor(); 
        Editor.Show(); // Editor is a WPF.Window 

       } 

      } 

} 

Il problema: Dopo finestra desiderata si apre, sotto forma di una vista ad albero si attiva, facendo nuova finestra per andare sfondo. Come rendere la nuova finestra per rimanere attiva?

risposta

8

Probabilmente è necessario lasciare che WPF completi il ​​lavoro di gestione degli eventi di clic del mouse corrente prima di aprire la nuova finestra. Lasciate che la nuova finestra essere il lavoro UI prossimo aggiungendolo alla coda del Dispatcher corrente come questo:

(...) 

//Editor.Show(); 
Action showAction =() => Editor.Show(); 
this.Dispatcher.BeginInvoke(showAction); 
+0

Eccellente! Funziona! –

+0

Soluzione semplice e piacevole. Grazie ! –

-1

nel costruttore della nuova forma set

this.Focus(); 

Inoltre, fa il nuovo modulo dovrebbe essere finestra modale? in caso affermativo utilizzare Editor.ShowDialog() anziché Editor.Show(); Risolve automaticamente il problema con lo stato

+0

Naturalmente, modalità aiuta. Ma non ho bisogno di modalità :) –

Problemi correlati