2012-12-27 112 views
5

我有一个WPF TreeView控件与XAML如下所示:WPF的TreeView恢复它的焦点后双击

<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> 

的任务是在一个子项,双击后打开某种形式。

代码隐藏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 

       } 

      } 

} 

问题:在希望的窗口打开,形成以一个TreeView激活自身,使得新的窗口去后台。 如何让新窗口保持活动状态?

回答

8

您可能需要让WPF在打开新窗口之前完成处理当前鼠标单击事件的工作。让新的窗口,将其添加到当前Dispatcher的队列这样是下一个 UI工作:

(...) 

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

非常好!这工作! –

+0

漂亮而简单的解决方案。谢谢 ! –

-1

在新的形式构造函数中设置

this.Focus(); 

此外,没有新的形式应该是模态窗口?如果是使用Editor.ShowDialog()而不是Editor.Show();它会自动解决焦点问题

+0

当然,情态帮助。但我不需要形式:) –