Pregunta

Estoy escribiendo mi primera aplicación en WPF y quieren tener la entrada del usuario ciertos datos en una ventana de diálogo modal.Al parecer, esto no es sencillo para hacer en WPF, porque el padre ventana permanece totalmente habilitada, y el método que creó el nuevo niño de la ventana de no parar y esperar a que el niño de la ventana para llamar a Close().En su lugar sólo mantiene en el futuro.Esto no es lo que quiero.

¿Cómo puedo conseguir que el niño de la ventana para abrir, y el padre o la madre de la ventana de esperar que el niño antes de cerrar la ventana padre continúa la ejecución?

¿Fue útil?

Solución

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

No olvide configurar Propiedad del propietario en la ventana de diálogo a la ventana principal. Esto evitará un comportamiento extraño cuando Alt + Tabulación, etc.

Otros consejos

Muchas de estas respuestas son simplistas, y si alguien está empezando WPF, puede que no conocen a todos los de la "ins-y-outs", como es más complicado que simplemente decirle a alguien "Uso .ShowDialog()!".Pero es el método (no .Show()) que desea utilizar con el fin de bloquear el uso de la ventana subyacente y mantener el código de continuar hasta que la ventana está cerrada.

En primer lugar, usted necesita 2 WPF windows.(Una será llamada la otra).

Desde la primera ventana, vamos a decir que fue llamado MainWindow.xaml, en su código-detrás de será:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

A continuación, agregar el botón a su XAML:

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

Y a la derecha-haga clic en el Click la rutina, selecciona "Ir a la definición".Se va a crear para usted en MainWindow.xaml.cs:

private void btnOpenModal_Click(object sender, RoutedEventArgs e)
{
}

Dentro de esa función, usted tiene que especificar la otra página a través de su página de la clase.Dicen que con nombre que otra página "ModalWindow", por lo que se convierte en su página de la clase y es la manera de crear una instancia (call) es:

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

Digamos que tiene un valor necesario establecer en el cuadro de diálogo modal.Crear un cuadro de texto y un botón en la ModalWindow XAML:

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

A continuación, crear un controlador de eventos (otro Click evento) de nuevo y se usa para guardar el valor del textbox a un público variable 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 .ShowDialog() declaración, usted puede tomar ese valor y uso:

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

    string valueFromModalTextBox = ModalWindow.myValue;
}

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 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á el despachador bombeando empujando un marco de despachador en el dipatcher WPF. Esto hará que la bomba de mensajes siga bombeando.

Dado un objeto de Ventana myWindow, myWindow.Show () lo abrirá sin modo y myWindow.ShowDialog () lo abrirá modalmente. Sin embargo, incluso este último no bloquea, por lo que recuerdo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top