Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

вот codeexample части кода. Я оставил все очевидные вещи:

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

Ответ 2

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

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

Ответ 3

CustomWindow cw = new CustomWindow();

cw.Owner = Application.Current.MainWindow;

cw.ShowInTaskbar = false;

cw.ShowDialog() ; 

Ответ 4

Просто сделать это в 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

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

Ответ 6

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

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

Ответ 7

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

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

Я создал обработчики событий для Window.Activated и Window.Deactived в окне, которое должно было быть Topmost в отношении моего приложения.

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

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

Ответ 8

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

Ответ 10

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

Нет, нет никакого способа сделать именно это.

Ответ 11

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

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

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

Ответ 12

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

WindowStartupLocation="CenterScreen"

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

YourWindow.ShowDialog();

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

Ответ 13

Попробуйте следующее:

Popup.PlacementTarget = sender as UIElement;

Ответ 14

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

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

Ответ 15

Как насчет 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

Ответ 16

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

Ответ 17

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

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

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

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

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

5) form1 добавить "используя System.Threading;"

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

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

Ответ 18

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

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

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

 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}}"/>