2011-11-12 30 views
17

Investigué en línea, pero no encontré ninguna solución para lo que quería o no estaba claro al respecto.WPF C# InputBox

Estoy haciendo una aplicación WPF usando C#. Quiero abrir un cuadro de diálogo para solicitar al usuario que ingrese su nombre. Después de eso, haré un seguimiento del nombre y guardaré algunos datos en un archivo txt usando el nombre.

Por ejemplo,

entrada Nombre es name = "John"

Y así tengo una datos de datos = "1, 2, 3";

y luego guardo los "datos" en el archivo John.txt.

¿Alguien sabe cómo hacerlo? Creo que el problema es cómo abrir un cuadro de diálogo para que el usuario ingrese el nombre.

¡Gracias!

+0

Eche un vistazo a http://social.msdn.microsoft.com/Forums/en/winforms/thread/191ddf61-3ae5-4845-b852-56bb9b77238a. – mjwills

Respuesta

30

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

Input Dialog

de diálogo de entrada ocultos

Input Dialog not showing.

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.

+1

Sí, tengo la idea. ¡Gracias! – user981924

+0

¿Cómo se evita que el control 'InputBox' pierda el foco mientras se muestra? – Marc

+0

@Marc He creado un control personalizado basado en el elemento ContentControl para mi cuadro de diálogo, y dentro de él anulo OnVisibleChanged, y si el cuadro de diálogo es visible configuro 'Keyboard.Focus (textBox);'. – eandersson

4

Simplemente crea otra clase de ventana en tu proyecto de Visual Studio, que contiene el nombre de usuario en una propiedad pública. Luego crea una instancia de esta ventana en algún lugar de tu ventana principal, y muéstrala usando el método ShowDialog. Esto bloquea hasta que se cierre la ventana de "diálogo". Luego puede obtener el nombre de usuario de la propiedad pública y hacer lo que quiera con él.

3

Cree/Agregue un nuevo Window en su proyecto para recibir la información del usuario. A continuación, puede utilizar Window.Show o Window.ShowDialog para mostrar esa ventana como una ventana emergente

También añadir un botón de OK n ventana creada y en el botón Aceptar Haga clic en Guardar la información en el archivo de texto

1

Sección de encargo cuadros de diálogo en MSDN podría darle alguna orientación: Custom Dialog Box in WPF. También hay ejemplos de código y fuente XAML.

Una vez que tenga que lidiar con eso, puede buscar cómo guardar datos en un archivo; es bastante fácil, y hay muchas maneras de hacerlo (uno de los cuales está usando la clase TextWriter: example).

4

Aquí está mi solución, tardé alrededor de 3 horas en escribirlo. Es completamente personalizable.

cadena var = new InputBox ("texto");

Y este es el código de la clase

 public class InputBox 
     { 

      Window Box = new Window();//window for the inputbox 
      FontFamily font = new FontFamily("Tahoma");//font for the whole inputbox 
      int FontSize=30;//fontsize for the input 
      StackPanel sp1=new StackPanel();// items container 
      string title = "InputBox";//title as heading 
      string boxcontent;//title 
      string defaulttext = "Scrivi quì il tuo nome...";//default textbox content 
      string errormessage = "Scelta non valida";//error messagebox content 
      string errortitle="Errore";//error messagebox heading title 
      string okbuttontext = "OK";//Ok button content 
      Brush BoxBackgroundColor = Brushes.GreenYellow;// Window Background 
      Brush InputBackgroundColor = Brushes.Ivory;// Textbox Background 
      bool clicked = false; 
      TextBox input = new TextBox(); 
      Button ok = new Button(); 
      bool inputreset = false; 
      public InputBox(string content) 
      { 
       try 
       { 
        boxcontent = content; 
       } 
       catch { boxcontent = "Error!"; } 
       windowdef(); 
      } 
      public InputBox(string content,string Htitle, string DefaultText) 
      { 
       try 
       { 
        boxcontent = content; 
       } 
       catch { boxcontent = "Error!"; } 
       try 
       { 
        title = Htitle; 
       } 
       catch 
       { 
        title = "Error!"; 
       } 
       try 
       { 
        defaulttext = DefaultText; 
       } 
       catch 
       { 
        DefaultText = "Error!"; 
       } 
       windowdef(); 
      } 
      public InputBox(string content, string Htitle,string Font,int Fontsize) 
      { 
       try 
       { 
        boxcontent = content; 
       } 
       catch { boxcontent = "Error!"; } 
       try 
       { 
        font = new FontFamily(Font); 
       } 
       catch { font = new FontFamily("Tahoma"); } 
       try 
       { 
        title = Htitle; 
       } 
       catch 
       { 
        title = "Error!"; 
       } 
       if (Fontsize >= 1) 
        FontSize = Fontsize; 
       windowdef(); 
      } 
      private void windowdef()// window building - check only for window size 
      { 
       Box.Height = 500;// Box Height 
       Box.Width = 300;// Box Width 
       Box.Background = BoxBackgroundColor; 
       Box.Title = title; 
       Box.Content = sp1; 
       Box.Closing += Box_Closing; 
       TextBlock content=new TextBlock(); 
       content.TextWrapping = TextWrapping.Wrap; 
       content.Background = null; 
       content.HorizontalAlignment = HorizontalAlignment.Center; 
       content.Text = boxcontent; 
       content.FontFamily = font; 
       content.FontSize = FontSize; 
       sp1.Children.Add(content); 

       input.Background = InputBackgroundColor; 
       input.FontFamily = font; 
       input.FontSize = FontSize; 
       input.HorizontalAlignment = HorizontalAlignment.Center; 
       input.Text = defaulttext; 
       input.MinWidth = 200; 
       input.MouseEnter += input_MouseDown; 
       sp1.Children.Add(input); 
       ok.Width=70; 
       ok.Height=30; 
       ok.Click += ok_Click; 
       ok.Content = okbuttontext; 
       ok.HorizontalAlignment = HorizontalAlignment.Center; 
       sp1.Children.Add(ok); 

      } 
      void Box_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
      { 
       if(!clicked) 
       e.Cancel = true; 
      } 
      private void input_MouseDown(object sender, MouseEventArgs e) 
      { 
       if ((sender as TextBox).Text == defaulttext && inputreset==false) 
       { 
        (sender as TextBox).Text = null; 
        inputreset = true; 
       } 
      } 
      void ok_Click(object sender, RoutedEventArgs e) 
      { 
       clicked = true; 
       if (input.Text == defaulttext||input.Text == "") 
        MessageBox.Show(errormessage,errortitle); 
       else 
       { 
        Box.Close(); 
       } 
       clicked = false; 
      } 
      public string ShowDialog() 
      { 
       Box.ShowDialog(); 
       return input.Text; 
      } 


     } 

esperan que pueda ser útil.