双击后,WPF TreeView恢复其焦点

时间:2012-12-27 13:54:06

标签: c# 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

                }

            }

}

问题:打开所需的窗口后,带有树视图的窗体会激活自己,使新窗口显示为背景。 如何让新窗口保持活动状态?

2 个答案:

答案 0 :(得分:9)

在打开新窗口之前,您可能需要让WPF完成处理当前鼠标单击事件的工作。让新窗口成为 next UI作业,方法是将其添加到当前Dispatcher的队列中,如下所示:

(...)

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

答案 1 :(得分:-1)

在新表单集的构造函数中

this.Focus();

另外,您的新表单应该是模态窗口吗?如果是,请使用Editor.ShowDialog()代替Editor.Show();它会自动解决焦点问题