Как заставить окно WPF быть поверх всех других окон моего приложения (не для всей системы)? - PullRequest
54 голосов
/ 30 марта 2010

Я хочу, чтобы мое окно было поверх всех других окон только в моем приложении . Если я устанавливаю свойство TopMost окна, оно становится поверх всех окон всех приложений, и я этого не хочу.

Ответы [ 18 ]

38 голосов
/ 18 июня 2012

Вам необходимо установить свойство владельца окна.

Вы можете показать окно через 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();
    }
  }
}
15 голосов
/ 30 марта 2010

Вместо этого вы можете использовать всплывающее окно, которое всегда будет TopMost, украсить его аналогично окну и полностью прикрепить его приложением, обработать событие LocationChanged вашего главного окна и установить для свойства IsOpen Popup значение false.

Edit:

Я надеюсь, вы хотите что-то вроде этого:

    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();
    }

Надеюсь, это поможет !!!

11 голосов
/ 27 марта 2012
CustomWindow cw = new CustomWindow();

cw.Owner = Application.Current.MainWindow;

cw.ShowInTaskbar = false;

cw.ShowDialog() ; 
5 голосов
/ 06 декабря 2010

используйте метод Activate (). Это пытается вывести окно на передний план и активировать его. например Окно wnd = new xyz (); wnd.Activate ();

5 голосов
/ 05 июля 2016

Просто сделать это в XAML , и удивился, что никто еще не опубликовал этот ответ.В следующем примере Window определен в ResourceLibrary (обратите внимание на x:Key), но вы также можете использовать эту привязку XAML для автономного ресурса WPF Page -стиля.

<Window x:Key="other_window" 
        Topmost="{Binding Source={x:Static Application.Current},Path=MainWindow.IsActive,Mode=OneWay}">
    <TextBlock Text="OTHER WINDOW" />
</Window>
5 голосов
/ 31 октября 2011

Лучший способ установить эти два события для всех окон вашего приложения:

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;
}
  • и, конечно, все окна, которые вы хотите быть верхними, должны быть доступны из других окон вашего приложения. в моем случае у меня есть базовое окно и еще несколько окон, которые должны быть в верхней части моего базового окна, так что это неплохо для моего базового окна с экземплярами окон друг друга.
4 голосов
/ 28 октября 2011

Во всплывающем окне перегружает метод 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)
4 голосов
/ 01 августа 2011

Я столкнулся с ситуацией, очень похожей на вас. Большинство из поисков , с которыми я сталкивался, указывало, что все, что мне нужно было сделать, - это установить владельца окон, которые я хочу быть самым верхним, в главное окно или любое другое окно, которое называется Show.

В любом случае, я пойду и опубликую решение, которое хорошо сработало для меня.

Я создал обработчики событий для Window.Activation и 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;
}

Это прекрасно работает для меня. Надеюсь, это полезно для кого-то еще там. : О)

2 голосов
/ 30 марта 2010

Есть несколько потоков, есть даже самый верхний тег. Поиск по этому, или перейдите непосредственно к этому сообщению, которое выглядит хорошо:

Как сохранить окно поверх всех других окон только в моем приложении?

1 голос
/ 08 апреля 2010

Я ОП. После некоторых исследований и испытаний ответ:

Нет, нет способа сделать точно это.

...