我有一个带有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
}
}
}
问题:打开所需的窗口后,带有树视图的窗体会激活自己,使新窗口显示为背景。 如何让新窗口保持活动状态?
答案 0 :(得分:9)
在打开新窗口之前,您可能需要让WPF完成处理当前鼠标单击事件的工作。让新窗口成为 next UI作业,方法是将其添加到当前Dispatcher的队列中,如下所示:
(...)
//Editor.Show();
Action showAction = () => Editor.Show();
this.Dispatcher.BeginInvoke(showAction);
答案 1 :(得分:-1)
在新表单集的构造函数中
this.Focus();
另外,您的新表单应该是模态窗口吗?如果是,请使用Editor.ShowDialog()
代替Editor.Show();
它会自动解决焦点问题