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

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

Ответы [ 18 ]

1 голос
/ 04 июля 2010

Вот способ сделать это: заставить ваше «верхнее» окно подписаться на события других окон GotFocus и LostFocus и использовать в качестве обработчиков событий следующее:

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

    void OtherWindow_GotFocus(object sender, EventArgs e)
    {
        this.Topmost = true;
    }
}
0 голосов
/ 11 февраля 2019

Я просто столкнулся с той же проблемой и обнаружил, что не могу настроить владельца с помощью MVVM, не вызывая сбои приложения в работе.У меня есть модель представления диспетчера окон, в которой есть команда для открытия окна с помощью URI окна - и я не смог установить владельца на App.MainWindow без сбоя приложения.

Итак - Вместо установки владельца я связал свойство TopMost окна со свойством в моей модели представления диспетчера окон, которое указывает, является ли приложение активным в данный момент.Если приложение активно, окно находится сверху, как мне хотелось бы.Если он не активен, другие окна могут его покрыть.

Вот что я добавил в свою модель просмотра:

 public class WindowManagerVM : GalaSoft.MvvmLight.ViewModelBase
    {
        public WindowManagerVM()
        {
            App.Current.Activated += (s, e) => IsAppActive = true;
            App.Current.Deactivated += (s, e) => IsAppActive = false;
        }

        private bool _isAppActive = true;
        public bool IsAppActive
        {
            get => _isAppActive;
            set
            {
                if (_isAppActive != value)
                {
                    _isAppActive = value;
                    RaisePropertyChanged(() => IsAppActive);
                }
            }
        }
    }

Вот XAML, который его реализует (я используюMVVM light с ViewModelLocator в качестве статического ресурса в моем приложении под названием Locator):

<Window Topmost="{Binding WindowManager.IsAppActive, Source={StaticResource Locator}}"/>
0 голосов
/ 21 мая 2018

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

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

2) перейдите в Project, затем форму New Windows, затем выберите форму Windows и назовите Splash.

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

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

5) добавление form1 с использованием System.Threading;

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

7) form1 add "splashscreen.Show ();" и "Application.DoEvents ();"

8) form1 В разделе События >> Фокус >> Активировано добавить «Thread.Sleep (4000); splashscreen.Close ();»

9) Splash.cs добавить в «Public Splash» добавить «this.BackColor = Color.Aqua;» / можно использовать любой цвет

10) Это код для Form1.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 секунд, поэтому ваша программа работает нормально.

0 голосов
/ 20 ноября 2017

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

0 голосов
/ 15 октября 2016

Как насчет 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
0 голосов
/ 31 марта 2010

Вы можете добавить это к своим тегам Windows

WindowStartupLocation="CenterScreen"

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

YourWindow.ShowDialog();

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

0 голосов
/ 27 июня 2015

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

CustomWindow cw = new CustomWindow();
cw.Owner = this;
cw.ShowDialog();
0 голосов
/ 30 октября 2013

Попробуйте это:

Popup.PlacementTarget = sender as UIElement;
...