Как сделать окно 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;
}
}
Как насчет 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 секунд, так что ваша программа в норме.