Estou escrevendo meu primeiro aplicativo no WPF e quero que o usuário insira alguns dados em uma janela de diálogo modal. Aparentemente, isso não é fácil de fazer no WPF, porque a janela pai permanece totalmente ativada e o método que criou a nova janela filho não para e aguarda a janela filho chamar Close (). Em vez disso, continua seguindo em frente. Não é isso que eu quero.
Como posso abrir a janela filho e esperar que o filho feche antes que a janela pai continue em execução?
.net
wpf
dialog
modal-dialog
Alex Baranosky
fonte
fonte
Respostas:
Você tentou mostrar sua janela usando o ShowDialog método ?
Não se esqueça de definir a propriedade Proprietário na janela de diálogo para a janela principal. Isso evitará comportamentos estranhos ao pressionar Alt + Tab, etc.
fonte
Muitas dessas respostas são simplistas e, se alguém está iniciando o WPF, pode não conhecer todas as "entradas e saídas", pois é mais complicado do que dizer a alguém "Use
.ShowDialog()
!". Mas esse é o método (não.Show()
) que você deseja usar para bloquear o uso da janela subjacente e impedir que o código continue até que a janela modal seja fechada.Primeiro, você precisa de 2 janelas WPF. (Um vai ligar para o outro.)
Na primeira janela, digamos que se chame MainWindow.xaml, em seu code-behind será:
Em seguida, adicione seu botão ao seu XAML:
E clique com o botão direito do mouse na
Click
rotina, selecione "Ir para a definição". Ele será criado para você no MainWindow.xaml.cs:Dentro dessa função, você deve especificar a outra página usando sua classe de página. Digamos que você nomeou essa outra página como "ModalWindow", para que ela se torne sua classe de página e é como você a instanciaria (chamava):
Digamos que você tenha um valor que precisa definir na sua caixa de diálogo modal. Crie uma caixa de texto e um botão no
ModalWindow
XAML:Em seguida, crie um manipulador de eventos (outro
Click
evento) novamente e use-o para salvar o valor da caixa de texto em uma variável estática públicaModalWindow
e ligarthis.Close()
.Depois da sua
.ShowDialog()
declaração, você pode pegar esse valor e usá-lo:fonte
Window.Show Window mostrará a janela e continuará a execução - é uma chamada sem bloqueio.
Window.ShowDialog irá bloquear o segmento de chamada (meio que [1]) e mostrar a caixa de diálogo. Ele também bloqueará a interação com a janela principal / proprietária. Quando a caixa de diálogo é descartada (por qualquer motivo), o ShowDialog retornará ao chamador e permitirá que você acesse o DialogResult (se desejar).
[1] Ele manterá o expedidor bombeando, empurrando uma estrutura do expedidor para o Dipatcher WPF. Isso fará com que a bomba de mensagens continue bombeando.
fonte
Dado um objeto Window, myWindow, myWindow.Show () o abrirá de maneira independente e myWindow.ShowDialog () o abrirá de maneira modal. No entanto, mesmo este último não bloqueia, pelo que me lembro.
fonte
ShowDialog
não retornam até o modal ser fechado e, portanto, bloqueiam a operação do despachante em execução no momento. MasShowDialog
ele efetivamente chamaDispatcher.Run()
, de modo que o expedidor continua executando as operações, mantendo a interface do usuário responsiva.