7

我有一个带有 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

                }

            }

}

问题:打开所需窗口后,带有树视图的表单会自行激活,使新窗口成为背景。如何使新窗口保持活动状态?

4

2 回答 2

10

在打开新窗口之前,您可能需要让 WPF 完成处理当前鼠标单击事件的工作。通过像这样将新窗口添加到当前调度程序的队列中,让新窗口成为下一个UI 作业:

(...)

//Editor.Show();
Action showAction = () => Editor.Show();
this.Dispatcher.BeginInvoke(showAction);
于 2012-12-28T23:55:34.650 回答
-1

在新表单集的构造函数中

this.Focus();

另外,你的新表单应该是模态窗口吗?如果是,则使用Editor.ShowDialog()而不是Editor.Show();它将自动解决焦点问题

于 2012-12-27T14:27:16.567 回答