una - ventana modal c#
¿Cómo hacer que una ventana de WPF esté encima de todas las demás ventanas de mi aplicación(no de todo el sistema)? (17)
¿Qué hay de 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
Quiero que mi ventana esté encima de todas las otras ventanas en mi aplicación solamente . Si configuro la propiedad TopMost de una ventana, se convierte en la parte superior de todas las ventanas de todas las aplicaciones y no quiero eso.
Aquí hay una manera de hacerlo: haga que su ventana "más alta" se suscriba a sus otros eventos de Windows GotFocus y LostFocus y use lo siguiente como controladores de eventos:
class TopMostWindow
{
void OtherWindow_LostFocus(object sender, EventArgs e)
{
this.Topmost = false;
}
void OtherWindow_GotFocus(object sender, EventArgs e)
{
this.Topmost = true;
}
}
En la ventana emergente, se sobrecarga el método Show () con un parámetro:
Public Overloads Sub Show(Caller As Window)
Me.Owner = Caller
MyBase.Show()
End Sub
Luego, en la ventana principal, llame a su método sobrecargado Mostrar ():
Dim Popup As PopupWindow
Popup = New PopupWindow
Popup.Show(Me)
En su lugar, puede usar un Popup que siempre será TopMost, decorarlo de forma similar a una Ventana y adjuntarlo por completo con su Aplicación manejar el evento LocationChanged de su Ventana principal y establecer la propiedad IsOpen de Popup en false.
Editar:
Espero que quieras algo como esto:
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();
}
¡¡¡Espero eso ayude!!!
Hay varios hilos, incluso hay una etiqueta "superior". Busque en eso, o vaya directamente a esta publicación que se ve bien:
¿Cómo mantener una ventana en la parte superior de todas las otras ventanas solo en mi aplicación?
La mejor manera es establecer estos dos eventos en todas las ventanas de tu aplicación:
GotKeyboardFocus
LostKeyboardFocus
De este modo:
WiondowOfMyApp_GotKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
{
windowThatShouldBeTopMost.TopMost = true;
}
WiondowOfMyApp_LostKeyboardFocus(object sender, System.Windows.Input.KeyboardFocusChangedEventArgs e)
{
windowThatShouldBeTopMost.TopMost = false;
}
- y seguramente todas las ventanas que querías ser superiores deberían ser accesibles desde otras ventanas de tu aplicación. en mi caso tengo una ventana base y otra algunas ventanas que deberían estar en la parte superior de mi ventana base, así que esto no fue malo para que mi ventana base tenga una instancia de cada una de las ventanas.
Me encontré con este mismo problema. Tengo una aplicación de escritorio que tiene varias ventanas WPF, y necesitaba que mi pantalla de presentación personalizada estuviera en la parte superior de las otras ventanas solo en mi aplicación. No hay otras ventanas abiertas cuando aparece mi pantalla de bienvenida, pero abro MainWindow desde mi pantalla de bienvenida después de cierta autenticación. Así que hice algo similar a lo que hizo @GlenSlayden, pero en el código subyacente, ya que, como dije, MainWindow no está disponible para mi:
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();
}
Ahora, mientras mi programa carga todas las otras ventanas desde MainWindow, la pantalla de bienvenida está en la parte superior, pero mientras el programa autentica al usuario, no está en la parte superior, por lo que puede hacer clic en otro programa y se ocultará detrás. Es lo más cercano que pude encontrar a una solución para este problema. No es perfecto porque aún supera a todas las demás aplicaciones mientras mi programa se carga después de la autenticación, pero eso no es muy largo en mi caso.
Me encontré con una situación muy similar a la tuya. La mayoría de las searches que encontré indicaron que todo lo que tenía que hacer era establecer el propietario de las ventanas que deseaba que fuera Topmost en la ventana principal o en cualquier ventana que llamara Mostrar.
De todos modos, seguiré adelante y publicaré una solución que funcionó bien para mí.
Creé controladores de eventos para Window.Activated y Window.Deactived en la ventana que supuestamente era Topmost con respecto a mi aplicación.
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;
}
Funciona muy bien para mí. Espero que esto sea útil para alguien más allá. : o)
Necesita establecer la propiedad del propietario de la ventana.
Puede mostrar una ventana mediante showdialog para bloquear su ventana principal, o puede mostrarla de manera normal y tenerla en la parte superior del propietario sin bloquear al propietario.
Aquí hay un ejemplo de código de la parte de código subyacente: omití todas las cosas obvias:
namespace Example
{
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();
}
}
}
Prueba esto:
Popup.PlacementTarget = sender as UIElement;
Puedes agregar esto a tus etiquetas de Windows
WindowStartupLocation="CenterScreen"
Luego también puede mostrarlo si desea que sus usuarios lo reconozcan para poder proceder
YourWindow.ShowDialog();
Primero pruébelo sin los parámetros TopMost y vea los resultados.
Simple de hacerlo en XAML , y sorprendido de que nadie haya publicado esta respuesta todavía. En el siguiente ejemplo, la Window
se define en una ResourceLibrary
(observe la x:Key
), pero también puede usar este enlace XAML en un recurso WPF de estilo de Page
independiente.
<Window x:Key="other_window"
Topmost="{Binding Source={x:Static Application.Current},Path=MainWindow.IsActive,Mode=OneWay}">
<TextBlock Text="OTHER WINDOW" />
</Window>
Solo aprendiendo C # y encontré una situación similar. pero encontré una solución que creo que puede ayudar. Es posible que haya pensado esto hace mucho tiempo. esto será desde comenzar un nuevo proyecto, pero puedes usarlo en cualquier.
1) Comience un nuevo proyecto.
2) vaya a Proyecto, luego a Nuevo formulario de Windows, luego seleccione Windows Form y nombre Splash.
3) configure el tamaño, el fondo, el texto, etc. según lo desee.
4) En Propiedades del formulario Splash.cs, establezca la Posición de inicio: CenterScreen y TopMost: true
5) form1 add "using System.Threading;"
6) form1 en la clase agrega "Splash splashscreen = new Splash ();"
7) form1 agrega "splashscreen.Show ();" y "Application.DoEvents ();"
8) form1 En Eventos >> Enfoque >> Activado agrega "Thread.Sleep (4000); splashscreen.Close ();"
9) Splash.cs agrega bajo "Splash público" agrega "this.BackColor = Color.Aqua;" / puedo usar cualquier color
10) Este es el código para 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) este es el código en Splash.cs
public partial class Splash : Form
{
public Splash()
{
InitializeComponent();
this.BackColor = Color.Aqua;
}
}
12) Descubrí que si NO haces algo en el salpicón, entonces la pantalla no permanecerá en la parte superior durante el tiempo que el primer formulario deba activarse. El recuento de subprocesos desaparecerá después de x segundos, por lo que su programa es normal.
Soy el OP. Después de algunas investigaciones y pruebas, la respuesta es:
No, no hay forma de hacer exactamente eso.
Yo también enfrenté el mismo problema y seguí a Google a esta pregunta. Recientemente encontré que lo siguiente funcionó para mí.
CustomWindow cw = new CustomWindow();
cw.Owner = this;
cw.ShowDialog();
usa el método Activate () Esto intenta llevar la ventana al primer plano y activarla. por ejemplo, Window wnd = new xyz (); wnd.Activate ();
CustomWindow cw = new CustomWindow();
cw.Owner = Application.Current.MainWindow;
cw.ShowInTaskbar = false;
cw.ShowDialog() ;