Prefiero tomar un enfoque utilizando los cuadros de diálogo que no bloquea la aplicación, y se aleja del cuadro de diálogo Win32 más tradicional.
Ejemplo
de diálogo de entrada ocultos
En este ejemplo utilizar una versión simplificada de la solución MVVM basado estoy usando para mis aplicaciones. Puede que no sea lindo, pero debe darte una idea sólida sobre los conceptos básicos que lo respaldan.
El XAML:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<Button Content="Cool Button" x:Name="CoolButton" Click="CoolButton_Click"/>
<ListBox x:Name="MyListBox"/>
</StackPanel>
<!-- It's important that this is in the end of the XAML as it needs to be on top of everything else! -->
<Grid x:Name="InputBox" Visibility="Collapsed">
<Grid Background="Black" Opacity="0.5"/>
<Border
MinWidth="250"
Background="Orange"
BorderBrush="Black"
BorderThickness="1"
CornerRadius="0,55,0,55"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<StackPanel>
<TextBlock Margin="5" Text="Input Box:" FontWeight="Bold" FontFamily="Cambria" />
<TextBox MinWidth="150" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="InputTextBox"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button x:Name="YesButton" Margin="5" Content="Yes" Background="{x:Null}" Click="YesButton_Click"/>
<Button x:Name="NoButton" Margin="5" Content="No" Background="{x:Null}" Click="NoButton_Click" />
</StackPanel>
</StackPanel>
</Border>
</Grid>
</Grid>
Es muy fácil mostrar este cuadro de diálogo, ya que sólo necesita fijar la visibilidad de la red a InputBox
visible. Luego, simplemente maneja los botones Sí/No y obtiene el texto de entrada desde el cuadro de texto.
Por lo tanto, en lugar de usar el código que requiere ShowDialog()
, simplemente configure la opción Visibility
en Visible
. Todavía hay algunas cosas que hacer en este ejemplo que manejaremos en código subyacente, como por ejemplo borrar el cuadro de Texto de entrada después de manejar los clics del botón Sí/No.
El código subyacente:
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void CoolButton_Click(object sender, RoutedEventArgs e)
{
// CoolButton Clicked! Let's show our InputBox.
InputBox.Visibility = System.Windows.Visibility.Visible;
}
private void YesButton_Click(object sender, RoutedEventArgs e)
{
// YesButton Clicked! Let's hide our InputBox and handle the input text.
InputBox.Visibility = System.Windows.Visibility.Collapsed;
// Do something with the Input
String input = InputTextBox.Text;
MyListBox.Items.Add(input); // Add Input to our ListBox.
// Clear InputBox.
InputTextBox.Text = String.Empty;
}
private void NoButton_Click(object sender, RoutedEventArgs e)
{
// NoButton Clicked! Let's hide our InputBox.
InputBox.Visibility = System.Windows.Visibility.Collapsed;
// Clear InputBox.
InputTextBox.Text = String.Empty;
}
}
}
El código subyacente podría fácilmente hacerse utilizando una dependencia, o como lógica modelo de vista, en este caso, pero por simplicidad que lo mantuvo en el código subyacente.
Eche un vistazo a http://social.msdn.microsoft.com/Forums/en/winforms/thread/191ddf61-3ae5-4845-b852-56bb9b77238a. – mjwills