Pergunta

Eu estou escrevendo minha primeira aplicação em WPF e quer ter a entrada do usuário alguns dados sobre uma janela de diálogo modal. Aparentemente, isso não é simples de fazer no WPF, porque as estadias janela pai totalmente habilitado, eo método que criou a nova janela filho não pára e espera para a janela filho para chamar Close (). Em vez disso ele simplesmente continua indo para a frente. Este não é o que eu quero.

Como posso obter a janela filho para abrir, e tem a espera janela pai para a criança perto antes de a janela pai continua a executar?

Foi útil?

Solução

Você tentou mostrar sua janela usando a ShowDialog método?

Não se esqueça de definir o propriedade proprietário na janela de diálogo para a janela principal. Isso vai evitar um comportamento estranho quando Alt + tabulação, etc.

Outras dicas

Muitas dessas respostas são simplistas, e se alguém está começando WPF, eles podem não saber todos os "ins-and-outs", como é mais complicado do que apenas dizer a alguém "Use .ShowDialog()!". Mas esse é o método (não .Show()) que deseja usar para uso de bloco da janela subjacente e manter o código de continuar até que a janela modal está fechada.

Em primeiro lugar, você precisa de 2 janelas WPF. (Um deles será chamando o outro.)

Desde a primeira janela, digamos que foi chamado MainWindow.xaml, em seu código-behind serão:

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

Em seguida, adicione o botão ao seu XAML:

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

e clique com o botão direito a rotina Click, selecione "Ir para definição". Ele vai criar isso para você em MainWindow.xaml.cs:

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

Dentro dessa função, você tem que especificar a outra página usando sua classe de página. Digamos que você nomeado que outra página "ModalWindow", de modo que se torna a sua classe de página e é como você iria instanciar (call)-lo:

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

Digamos que você tenha um valor que você precisa configurar no seu diálogo modal. Criar uma caixa de texto e um botão no XAML ModalWindow:

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

Em seguida, crie um manipulador de eventos (outro evento Click) novamente e usá-lo para salvar o valor caixa de texto para uma variável estática pública em ModalWindow e this.Close() chamada.

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();
    }
}

Então, depois de sua declaração .ShowDialog(), você pode pegar esse valor e usá-lo:

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

    string valueFromModalTextBox = ModalWindow.myValue;
}

Window.Show janela irá mostrar a janela e continuar a execução. - É uma chamada sem bloqueio

Window.ShowDialog irá bloquear o segmento de chamada (kinda [1]), e mostrar a janela. Ele também irá bloquear a interação com a janela pai / proprietário. Quando o diálogo é descartada (forwhatever razão) ShowDialog retornará para o chamador, e lhe permitirá o acesso DialogResult (se você quiser).

[1] Vai manter o bombeamento expedidor, empurrando um quadro distribuidor para o dipatcher WPF. Isso fará com que a bomba de mensagem para continuar a bombear.

Dada uma MyWindow objeto Window, myWindow.Show () irá abri-lo modelessly e myWindow.ShowDialog () irá abri-lo de forma modal. No entanto, mesmo que este último não bloquear, pelo que me lembro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top