Como fazer caixa de diálogo modal no WPF?
-
20-08-2019 - |
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?
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.