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

Syl*_*ain 60 c# wpf topmost

我希望我的窗口只能在我的应用程序中的所有其他窗口之上.如果我设置窗口的TopMost属性,它将变为所有应用程序的所有窗口之上,我不希望这样.

Joh*_*nes 42

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

您可以通过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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是我一直在寻找的 - 如何打开一个新窗口,在关闭之前保持焦点/活动。谢谢你。 (2认同)
  • 最好将`myOwnedDialog.ShowInTaskbar = false;`添加到`NewWindowAsDialog`中 (2认同)

vik*_*iky 15

相反,你可以使用一个总是TopMost的Popup,将它装饰成类似于Window并将它完全附加到你的Application处理主窗口的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();
    }
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!!!


小智 11

CustomWindow cw = new CustomWindow();

cw.Owner = Application.Current.MainWindow;

cw.ShowInTaskbar = false;

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


Gle*_*den 6

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>
Run Code Online (Sandbox Code Playgroud)


Sud*_*ngh 5

使用Activate()方法.这会尝试将窗口置于前台并激活它.例如Window wnd = new xyz(); wnd.Activate();


小智 5

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

Public Overloads Sub Show(Caller As Window)
    Me.Owner = Caller
    MyBase.Show()
End Sub
Run Code Online (Sandbox Code Playgroud)

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

Dim Popup As PopupWindow

Popup = New PopupWindow
Popup.Show(Me)
Run Code Online (Sandbox Code Playgroud)


Omi*_*-RH 5

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

GotKeyboardFocus
LostKeyboardFocus
Run Code Online (Sandbox Code Playgroud)

通过这种方式:

WiondowOfMyApp_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
{
    windowThatShouldBeTopMost.TopMost = true;
}

WiondowOfMyApp_LostKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
{
    windowThatShouldBeTopMost.TopMost = false;
}
Run Code Online (Sandbox Code Playgroud)
  • 当然,您想要成为顶级的所有窗口都应该可以从您应用的其他窗口访问.在我的情况下,我有一个基本窗口和另一些应该是我的基本窗口顶部的窗口,所以这对我的基本窗口有不同的每个窗口的实例.


Chr*_*ton 2

有几个线程,甚至还有一个“最顶层”标签。搜索一下,或者直接转到这篇看起来不错的帖子:

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

  • 该问题适用于“Windows 窗体”Windows。我有 WPF 窗口。 (4认同)