在我的WPF应用程序中,我在主窗体上有一个ListView,它显示来自DataSet的绑定数据。当用户双击ListView中的一行时,它会打开一个详细信息窗口。
在我的XAML中,我使用样式在listview上创建双击处理程序:
<Style x:Key="ListViewDoubleClick" TargetType="{x:Type ListViewItem}">
<EventSetter Event="MouseDoubleClick" Handler="HandleDoubleClick" />
</Style>
...
<ListView Name="searchResults" ItemContainerStyle="{StaticResource ListViewDoubleClick}>
在代码隐藏中,我有一个跟踪打开的详细信息窗口的词典(多个可以一次打开),这样如果一个细节窗口已经打开,它就会被带到前面。我像这样处理双击:
private void HandleDoubleClick(object sender, MouseEventArgs e)
{
DataRowView clickedRow = ((ListViewItem)sender).Content as DataRowView;
int row = (int)clickedRow.Row["ID"];
if (!displayedCards.ContainsKey(row))
{
DetailWindow window = new DetailWindow(RetrieveData(row));
//window.Owner = this;
displayedCards.Add(row, window);
window.Show();
}
else
{
displayedCards[row].Activate();
}
}
我的问题是,使用上面的代码,在主窗体后面打开详细信息窗口。如果我设置了所有者信息(window.Owner = this
),则会在主窗体的顶部打开详细信息窗口,但主窗体永远不会出现在详细信息窗口的前面。
displayedCards[row].Activate()
按照我的预期工作,将详细信息窗口置于所有其他详细信息窗口的前面,但它会成为上述问题的受害者 - 它不会出现在主窗口的前面。
我想要完成的是将详细信息窗口放在与主窗口相同的级别/层(/ z顺序?)上,以便两者可以显示在彼此之上,并使详细信息窗口显示在它们打开时的主要形式的顶部。
修改:如果重要,则详细信息窗口没有WindowStyle
,AllowsTransparency
设置为true。我也没有窗口标题,窗口没有出现在任务栏中。在尝试解决此问题时,我尝试将WindowStyle
设置为SingleBorderWindow
,并且出现同样的问题,除了详细信息窗口的边框显示在主窗体的顶部,因为详细信息窗口是被绘制,然后它被推到主窗体后面。在显示详细信息窗口后,我的双击处理程序是否可以将主窗体拉到前面?
答案 0 :(得分:8)
看起来您没有告诉事件路由系统您已处理该事件。尝试将e.Handled
设置为true,告诉WPF不允许进一步处理您的活动。有关Handled属性如何更改事件路由的详细信息,请参阅RoutedEventArgs.Handled Property和Marking Routed Events as Handled, and Class Handling。