.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;
}