modal ejemplo dialogbox .net wpf dialog modal-dialog

.net - dialogbox - showdialog c# ejemplo



¿Cómo se hace un diálogo modal en WPF? (4)

Estoy escribiendo mi primera aplicación en WPF y quiero que el usuario ingrese algunos datos en una ventana de diálogo modal. Aparentemente, esto no es fácil de hacer en WPF, porque la ventana padre permanece completamente habilitada, y el método que creó la nueva ventana secundaria no se detiene y espera a que la ventana secundaria llame a Close (). En cambio, simplemente sigue avanzando. Esto no es lo que quiero.

¿Cómo puedo hacer que se abra la ventana secundaria y que la ventana principal espere a que el hijo se cierre antes de que la ventana principal continúe ejecutándose?


¿ ShowDialog mostrar su ventana usando el método ShowDialog ?

No olvide establecer la propiedad Owner en la ventana de diálogo en la ventana principal. Esto evitará comportamientos extraños cuando Alt + Tabbing, etc.


Dado un objeto Window myWindow, myWindow.Show () lo abrirá sin moderación y myWindow.ShowDialog () lo abrirá de forma modal. Sin embargo, incluso este último no bloquea, por lo que recuerdo.


Window.Show Window 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 diálogo. También bloqueará la interacción con la ventana principal / propietaria. Cuando se cierra el diálogo (por cualquier motivo) ShowDialog regresará a la persona que llama, y ​​le permitirá acceder a DialogResult (si lo desea).

[1] Mantendrá al despachador bombeando al presionar un marco de despachador en el dipatcher de WPF. Esto hará que la bomba de mensajes siga bombeando.


Muchas de estas respuestas son simplistas, y si alguien está comenzando WPF, es posible que no conozca todos los "pormenores", 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, necesitas 2 ventanas de 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(); } }

A continuación, agregue su botón a su XAML:

<Button Name="btnOpenModal" Click="btnOpenModal_Click" Content="Open Modal" />

Y haga clic con el botón derecho en la rutina Click , seleccione "Ir a la 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 llamó a esa otra página "ModalWindow", por lo que se convierte en su clase de página y es cómo la instanciaría (llamará):

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 ModalWindow XAML:

<StackPanel Orientation="Horizontal"> <TextBox Name="txtSomeBox" /> <Button Name="btnSaveData" Click="btnSaveData_Click" Content="Save" /> </StackPanel>

A continuación, cree un controlador de eventos (otro evento Click ) nuevamente y ModalWindow para guardar el valor del cuadro de texto en una variable pública estática en ModalWindow y llame a 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(); } }

Luego, después de su declaración .ShowDialog() , puede tomar ese valor y usarlo:

private void btnOpenModal_Click(object sender, RoutedEventArgs e) { ModalWindow modalWindow = new ModalWindow(); modalWindow.ShowDialog(); string valueFromModalTextBox = ModalWindow.myValue; }