【问题标题】:New WPF window only shows underneath originating window新的 WPF 窗口仅显示在原始窗口下方
【发布时间】:2011-09-09 16:34:28
【问题描述】:

在我的 WPF 应用程序中,我在主窗体上有一个 ListView,它显示来自 DataSet 的绑定数据。当用户双击 ListView 中的一行时,它会打开一个详细信息窗口。

在我的 XAML 中,我使用一种样式在列表视图上创建双击处理程序:

<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,并出现了同样的问题,除了详细窗口的边框在绘制详细窗口时显示在主窗体的顶部,并且然后它被推到主窗体后面。显示详细信息窗口后,我的双击处理程序本质上是否可以将主窗体拉到前面?

【问题讨论】:

    标签: c# wpf window z-order


    【解决方案1】:

    您似乎没有告诉事件路由系统您已处理该事件。尝试将 e.Handled 设置为 true 以告诉 WPF 不允许对您的事件进行任何进一步处理。有关 Handled 属性如何更改事件路由的详细信息,请参阅 RoutedEventArgs.Handled PropertyMarking Routed Events as Handled, and Class Handling

    【讨论】:

    • 就是这样做的——将e.Handled = true; 添加到我的双击处理程序的开头现在可以使所有的窗口都像我预期的那样运行。谢谢!
    • 你救了我!几个月我的客户抱怨双击打开和隐藏他们的窗口。谢谢你一百遍!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多