如何使WPF窗口在我的应用程序(而不是系统)的所有其他窗口之上?

我希望我的窗口只能在我的应用程序的所有其他窗口之上。 如果我设置窗口的TopMost属性,它将成为所有应用程序的所有窗口的顶部,我不想这样做。

您需要设置窗口的所有者属性。

您可以通过showdialog显示一个窗口,以阻止您的主窗口,或者您可以正常显示并将其放在主人的顶部,而不会阻挡主人。

这里是代码隐藏部分的代码示例 – 我忽略了所有明显的东西:

namespace StackoverflowExample { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } void NewWindowAsDialog(object sender, RoutedEventArgs e) { Window myOwnedDialog = new Window(); myOwnedDialog.Owner = this; myOwnedDialog.ShowDialog(); } void NormalNewWindow(object sender, RoutedEventArgs e) { Window myOwnedWindow = new Window(); myOwnedWindow.Owner = this; myOwnedWindow.Show(); } } } 

相反,你可以使用一个永远是TopMost的Popup,像Window一样装饰它,然后把它与你的应用程序完全连接,处理你主窗口的LocationChanged事件,并将Popup的IsOpen属性设置为false。

编辑:

我希望你想要这样的东西:

  Window1 window; private void Button_Click(object sender, RoutedEventArgs e) { window = new Window1(); window.WindowStartupLocation = WindowStartupLocation.CenterScreen; window.Topmost = True; this.LocationChanged+=OnLocationchanged; window.Show(); } private void OnLocationchanged(object sender, EventArgs e) { if(window!=null) window.Close(); } 

希望能帮助到你!!!

 CustomWindow cw = new CustomWindow(); cw.Owner = Application.Current.MainWindow; cw.ShowInTaskbar = false; cw.ShowDialog() ; 

最好的方法是将这两个事件设置到您的应用程序的所有窗口:

 GotKeyboardFocus LostKeyboardFocus 

通过这种方式:

 WiondowOfMyApp_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e) { windowThatShouldBeTopMost.TopMost = true; } WiondowOfMyApp_LostKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e) { windowThatShouldBeTopMost.TopMost = false; } 
  • 当然所有的窗口,你想成为顶级,应该可以从您的应用程序的其他窗口访问。 在我的情况下,我有一个基本窗口和另一些窗口,应该是我的基本窗口的顶部,所以这是不坏的,我的基本窗口有每个另一个窗口的实例。

使用Activate()方法。 这试图把窗口放到前台并激活它。 例如Window wnd = new xyz(); wnd.Activate();

我遇到了和你类似的情况。 我遇到的大部分search都表明我需要做的就是将我希望成为最高层的窗口的所有者设置为主窗口或任何称为Show的窗口。

无论如何,我会继续发布一个适合我的解决scheme。

我创build了Window.Activated和Window.Deactived事件处理程序的窗口应该是我的应用程序的最高层。

 private void Window_Activated(object sender, EventArgs e) { Topmost = true; } private void Window_Deactived(object sender, EventArgs e) { if(Owner == null || Owner.IsActive) return; bool hasActiveWindow = false; foreach(Window ownedWindow in Owner.OwnedWindows) { if(ownedWindow.IsActive) hasActiveWindow = true; } if(!hasActiveWindow) Topmost = false; } 

这对我很有效。 希望这对其他人有用。 :O)

在popup窗口中,使用参数重载Show()方法:

 Public Overloads Sub Show(Caller As Window) Me.Owner = Caller MyBase.Show() End Sub 

然后在主窗口中调用你的重载方法Show():

 Dim Popup As PopupWindow Popup = New PopupWindow Popup.Show(Me) 

有几个线程,甚至有一个“最高”的标签。 search,或直接去看这个post看起来不错:

如何在我的应用程序中的所有其他窗口上保持一个窗口?

您可以将其添加到您的Windows标签

 WindowStartupLocation="CenterScreen" 

然后,如果您希望用户确认以继续操作,也可以显示它

 YourWindow.ShowDialog(); 

首先尝试没有TopMost参数,看看结果。

我是OP。 经过一番研究和testing,答案是:

不,没有办法做到这一点。

很容易做到这一点在XAML ,并感到惊讶,没有人发布这个答案呢。 在以下示例中, WindowResourceLibrary定义(请注意x:Key ),但是您也可以在独立的Page样式WPF资源上使用此XAML绑定。

 <Window x:Key="other_window" Topmost="{Binding Source={x:Static Application.Current},Path=MainWindow.IsActive,Mode=OneWay}"> <TextBlock Text="OTHER WINDOW" /> </Window> 

这里有一个办法:使你的“最顶层”窗口订阅你的其他窗口GotFocus和LostFocus事件,并使用以下作为事件处理程序:

 class TopMostWindow { void OtherWindow_LostFocus(object sender, EventArgs e) { this.Topmost = false; } void OtherWindow_GotFocus(object sender, EventArgs e) { this.Topmost = true; } } 

尝试这个:

 Popup.PlacementTarget = sender as UIElement; 

怎么样:

 Private Sub ArrangeWindows(Order As Window()) For I As Integer = 1 To Order.Length -1 Order(I).Owner = Order(I - 1) Next End Sub 

我也面临同样的问题,并跟踪谷歌这个问题。 最近我发现以下工作对我来说。

 CustomWindow cw = new CustomWindow(); cw.Owner = this; cw.ShowDialog(); 

我刚刚遇到了同样的问题。 我有一个桌面应用程序,有多个WPF窗口,我需要我的自定义启animation面只在我的应用程序的其他窗口的顶部。 当我的启animation面出现时,没有其他的窗口打开,但是我经过一些validation后,从我的启animation面打开了MainWindow。 所以我只是做了类似于@GlenSlayden做的事情,但是在后面的代码中,就像我说的,MainWindow不适合我:

 private void SplashScreen_ContentRendered(object sender, EventArgs e) { // User authentication... // ... MainWindow mainWindow = new MainWindow(); SetBinding(SplashScreen.TopmostProperty, new Binding("IsVisible")) { Source = mainWindow, Mode = BindingMode.OneWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged }; mainWindow.Show(); } 

现在,当我的程序从MainWindow加载所有其他窗口时,启animation面是最上面的,但是当程序validation用户时,它不是最顶层的,所以你可以点击其他程序,它会隐藏在它后面。 这是我能find解决这个问题最近的东西。 这不是完美的,因为它仍然覆盖所有其他应用程序的顶部,而我的程序在身份validation后加载,但对我来说这不是很长。

Interesting Posts