Я хочу, чтобы мое окно было поверх всех других окон только в моем приложении. Если я устанавливаю свойство TopMost окна, он становится поверх всех окон всех приложений, и я не хочу этого.
Как сделать окно WPF поверх всех других окон моего приложения (а не по всей системе)?
Ответ 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)
Ответ 9
Есть несколько потоков, есть даже "самый верхний" тег. Найдите это или перейдите прямо к этому сообщению, которое выглядит хорошо:
Как сохранить окно поверх всех других окон только в моем приложении?
Ответ 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}}"/>