Solución:
¿Intentó mostrar su ventana con el método ShowDialog?
No olvide establecer la propiedad Propietario en la ventana de diálogo en la ventana principal. Esto evitará comportamientos extraños cuando Alt + Tabbing, etc.
Muchas de estas respuestas son simplistas, y si alguien está comenzando con WPF, es posible que no conozca todos los “entresijos”, ya que es más complicado que simplemente decirle a alguien “Use .ShowDialog()
! “. Pero ese es el método (no .Show()
) que desea utilizar para bloquear el uso de la ventana subyacente y evitar que el código continúe hasta que se cierre la ventana modal.
Primero, necesita 2 ventanas WPF. (Uno llamará al otro).
Desde la primera ventana, digamos que se llamó MainWindow.xaml, en su código subyacente será:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
Luego agregue su botón a su XAML:
<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />
Y haga clic derecho en el Click
rutina, seleccione “Ir a definición”. Lo creará para usted en MainWindow.xaml.cs:
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}
Dentro de esa función, debe especificar la otra página usando su clase de página. Digamos que nombró esa otra página “ModalWindow”, de modo que se convierta en su clase de página y así es como la instanciaría (llamaría):
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
ModalWindow modalWindow = new ModalWindow();
modalWindow.ShowDialog();
}
Digamos que tiene un valor que necesita establecer en su diálogo modal. Cree un cuadro de texto y un botón en el ModalWindow
XAML:
<StackPanel Orientation="Horizontal">
<TextBox Name="txtSomeBox" />
<Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" />
</StackPanel>
Luego crea un controlador de eventos (otro Click
event) de nuevo y utilícelo para guardar el valor del cuadro de texto en una variable estática pública en ModalWindow
y llama this.Close()
.
public partial class ModalWindow : Window
{
public static string myValue = String.Empty;
public ModalWindow()
{
InitializeComponent();
}
private void btnSaveData_Click(object sender, RoutedEventArgs e)
{
myValue = txtSomeBox.Text;
this.Close();
}
}
Entonces, después de tu .ShowDialog()
declaración, puede tomar ese valor y usarlo:
private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
ModalWindow modalWindow = new ModalWindow();
modalWindow.ShowDialog();
string valueFromModalTextBox = ModalWindow.myValue;
}
Window.Show mostrará la ventana y continuará la ejecución; es una llamada sin bloqueo.
Window.ShowDialog bloqueará el hilo de llamada (un poco [1]) y mostrar el cuadro de diálogo. También bloqueará la interacción con la ventana principal / propietaria. Cuando se cierra el cuadro de diálogo (por cualquier motivo), ShowDialog volverá a la persona que llama y le permitirá acceder a DialogResult (si lo desea).
[1] Mantendrá al despachador bombeando empujando un marco de despachador en el despachador de WPF. Esto hará que la bomba de mensajes siga bombeando.