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

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

17 ответов


необходимо задать свойство owner окна.

вы можете показать окно через showdialog, чтобы заблокировать главное окно, или вы можете показать его нормально и иметь его на вершине владельца без блокировки владельца.

вот пример codeexample части codebehind - я пропустил все очевидные вещи:

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

вместо этого вы можете использовать всплывающее окно, которое всегда будет самым верхним, украсить его подобно окну и прикрепить его полностью с помощью приложения обрабатывать событие 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();
    }

надеюсь, что это помогает!!!


CustomWindow cw = new CustomWindow();

cw.Owner = Application.Current.MainWindow;

cw.ShowInTaskbar = false;

cw.ShowDialog() ; 

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


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

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

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

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

Я создал обработчики событий для Window.Активировано и окно.Деактивирован в окне, которое должно было быть самым верхним по отношению к моему приложению.

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)


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

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

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


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

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

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

нет, нет никакого способа, чтобы сделать ровно что.


вы можете добавить это в свои теги windows

WindowStartupLocation="CenterScreen"

затем вы также можете отобразить его, если хотите, чтобы ваши пользователи признали его, чтобы продолжить

YourWindow.ShowDialog();

сначала попробуйте без верхних параметров и посмотрите результаты.


вот как это сделать: Сделайте ваше" верхнее " окно подписаться на другие события windows 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;

Как насчет htis:

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

Я тоже столкнулся с той же проблемой и последовал за Google на этот вопрос. Недавно я обнаружил, что для меня работает следующее.

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

Я только что столкнулся с этой же проблемой. У меня есть настольное приложение с несколькими окнами WPF, и мне нужно, чтобы мой пользовательский заставка была поверх других окон только в моем приложении. Никакие другие окна не открываются, когда появляется мой заставка, но я открываю главное окно из моего заставки после некоторой аутентификации. Поэтому я просто сделал что-то похожее на то, что сделал @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();
}

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


просто изучая C# и столкнулся с аналогичной ситуацией. но нашел решение, которое я думаю, может помочь. Возможно, вы уже давно это поняли. это будет от запуска нового проекта, но вы можете использовать его в любом.

1) начать новый проект.

2) Перейдите в проект, затем в новую форму Windows, затем выберите Windows Form и Name Splash.

3) настроить размер, фон, текст и т. д. По желанию.

4) В разделе свойства всплеска.cs форма установить начальную позицию: Центральный экран и верхний: true

5) формы form1 добавить "с помощью системы.Нить;"

6) form1 в разделе класс добавить " Splash splashscreen = new Splash ();"

7) form1 добавить " splashscreen.Show (); "and" Application.DoEvents ();"

8) form1 в разделе События> > фокус> > активировано добавить " поток.Сон(4000); splashscreen.Close ();"

9) всплеск.cs добавить в разделе "Public Splash" добавить " это.Цвет Фона = Цвет.Aqua; " / может использовать любой цвет

10) это код для формы 1.cs

public partial class Form1 : Form
{
    Splash splashscreen = new Splash();
    public Form1()
    {
        InitializeComponent();
        splashscreen.Show();
        Application.DoEvents();

    }

    private void Form1_Activated(object sender, EventArgs e)
    {
        Thread.Sleep(4000);
        splashscreen.Close();
    }
}

11) это код на Splash.cs

public partial class Splash : Form
{
    public Splash()
    {
        InitializeComponent();
        this.BackColor = Color.Aqua;
    }
}

12) я обнаружил, что если вы не делаете что-то в заставке, то экран не будет оставаться на вершине в течение того времени, первая форма должна активировать. Количество потоков исчезнет всплеск через x секунд, так что ваша программа в норме.