模态对话框没有显示在其他窗口的顶部

Pra*_*atz 26 wpf showdialog

我正在使用Window.ShowDialog()在我的WPF(MVVM)应用程序中打开一个模态窗口,但它允许我使用Windows任务栏(Windows 7)导航到其他窗口.

考虑一下:我在我的应用程序中打开了3个非模态窗口.现在其中一个打开一个模态窗口使用Window.ShowDialog().我也设置Application.MainWindow为模态窗口的所有者.这是因为我使用MVVM消息传递并且消息处理程序打开一个新窗口是集中的App.xaml.cs.窗口打开模态 - 没有问题.但是,Windows 7允许我从任务栏切换到其他应用程序窗口.这导致模态窗口落在另一个窗口后面的情况,我不希望这样.

只要我打开模态,我就无法在其他窗口上做任何事情,但如果模态窗口始终保持在顶部,只要打开它就会很好.有没有办法在模态打开时禁用任务栏切换?仅供参考 - 从应用程序启动的所有打开的窗口在任务栏上显示为单独的条目.

提前致谢!

use*_*116 61

没有任何代码可以作为基础,但听起来你已经在Window你创建的东西上留下了一些属性,并期望ShowDialog应用额外的"对话框"语义:

Window window = new Window()
{
    Title = "Modal Dialog",
    ShowInTaskbar = false,               // don't show the dialog on the taskbar
    Topmost = true,                      // ensure we're Always On Top
    ResizeMode = ResizeMode.NoResize,    // remove excess caption bar buttons
    Owner = Application.Current.MainWindow,
};

window.ShowDialog();
Run Code Online (Sandbox Code Playgroud)


小智 11

只需将Window的owner属性设置为调用窗口即可.然后在任务栏中激活WPF应用程序不仅会激活MainWindow,还会激活模态子窗口并将其置于前端.

ChildWindow C = new ChildWindow();
C.Owner = this;
C.ShowDialog();
Run Code Online (Sandbox Code Playgroud)


koa*_*lix 10

将Topmost设置为True(Topmost = True)会使对话框位于系统中所有窗口的顶部(不仅仅是在应用程序中).

因此,您可以尝试在主窗口中注册Activated事件:

Activated += WindowActivated;
Run Code Online (Sandbox Code Playgroud)

每当应用程序的另一个主窗口变为活动状态时,激活模式对话框的所有者窗口.

private void WindowActivated(object sender, EventArgs e)
{
    Window window = Application.Current.Windows.OfType<YourMainWindow>().FirstOrDefault(p => p != this && !p.IsActive && p.OwnedWindows.Count > 0);
    if (window != null)
    {
        window.Activate();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个简单的hack假设你的所有子窗口都是模态的,但你可以编写一个更复杂的逻辑.