2011-08-07 6 views
9

Al activar una aplicación, aparecerá un cuadro de texto con el texto "hola".Eliminar texto después de hacer clic en el cuadro de texto

Mi pregunta es:
Cuando hace clic en el cuadro de texto para hacer datos de entrada, quiero eliminar el texto automáticamente en el código XAML, ¿cómo lo hago?

+0

Igual que http://stackoverflow.com/questions/833943/watermark-hint-text-placeholder-textbox-in-wpf –

Respuesta

26

Maneje el evento UIElement.GotFocus, y en el controlador, borre el texto. También querrá quitar el controlador, de modo que si hace clic en TextBox por segunda vez, no pierde lo que ya ha ingresado.

Algo como esto:

XAML:

<TextBox Text="Hello" GotFocus="TextBox_GotFocus" /> 

de código subyacente:

public void TextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    TextBox tb = (TextBox)sender; 
    tb.Text = string.Empty; 
    tb.GotFocus -= TextBox_GotFocus; 
} 
+0

¡un buen consejo !, gracias. – MuhammadHani

+0

¿Podría elaborar en la última línea de código, por favor? ¿Qué hace y por qué es necesario? Gracias. – Jakov

+0

@Jakov, "También querrás quitar el controlador" -> El controlador se asignó en XAML, GotFocus = "TextBox_GotFocus", esto lo elimina para que no pierdas el texto la próxima vez. –

5

Hay que poner en práctica los dos eventos GetFocus y LostFocus. De esta forma, puede volver a establecer el texto predeterminado en el evento de enfoque perdido si no se ingresa texto.

private const string defaultText = "Hello"; 

private void myTextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    myTextBox.Text = myTextBox.Text == defaultText ? string.Empty : myTextBox.Text; 
} 

private void myTextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    myTextBox.Text = myTextBox.Text == string.Empty ? defaultText : myTextBox.Text; 
} 
7

Implementación de XAML que no requiere código subyacente. Esto se copia de la plantilla de un control personalizado que construí, y es probable que desee hacer esto como un control personalizado.

La idea básica es que hay dos TextBox es en un Grid. El de arriba es el control real con el que el usuario interactúa, pero es invisible (su 'Opacidad' es cero) a menos que contenga texto o tenga el foco. El de abajo contiene el texto del mensaje. Solo será visible cuando el TextBox encima no esté, y nunca se enfocará.

Probablemente tendrá que perder el enlace en el TextBox editable, pero esto debería comenzar.

<Grid> 
     <TextBox Text="This is the prompt text" 
       FontStyle="Italic" 
       Foreground="LightGray" 
       Focusable="False"> 
     </TextBox> 
     <TextBox Text="{Binding TextProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
       Focusable="True"> 
      <TextBox.Style> 
       <Style TargetType="TextBox"> 
        <Setter Property="Opacity" 
          Value="1" /> 
        <Style.Triggers> 
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsFocused" 
             Value="False" /> 
           <Condition Property="Text" 
             Value="" /> 
          </MultiTrigger.Conditions> 
          <Setter Property="Opacity" 
            Value="0" /> 
         </MultiTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 
    </Grid> 
+1

+1 Esta es una solución más amigable con MVVM ya que no requiere código subyacente. Esto también podría convertirse en una Plantilla de Control para que pueda referirse a este estilo con una clave. – fatty

0

que acabo de hacer esto:

XAML:

<TextBox Name="Filename" 
     Grid.Column="0" 
     Height="23" 
     Margin="10,9,0,0" 
     Text="Enter Export Filename here" 
     Width="193" 
     GotFocus="Filename_GotFocus" 
     /> 

Código atrás:.

private void Filename_GotFocus(object sender, RoutedEventArgs e) 
     { 
      Filename.Text = "";    
     } 
+0

Por supuesto, la respuesta popular hace lo que se anuncia, ya que una vez que comienzas a escribir mantendrá lo que ya has escrito. Mi respuesta borra el cuadro de texto cada vez que se ha obtenido el foco. – Petermac

0

Quiero actualizar respuesta de Donut (aplicable para Windows 8)

Código detrás código sea

public void TextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 

    TextBox tb = (TextBox)sender; 

    if(tb.Text != "SOME DEFAULT TEXT") 
    { 

    String persentContentWithDefaultString = t.Text as string; 
    tb.Text = persentContentWithDefaultString[0].ToString(); 
    // set cursor position 
     tb.Select(1, 0);   

     tb.GotFocus -= TextBox_GotFocus; 
} 
} 

actully en mi página, había dos cuadro de texto y un botón. [Nombre de usuario, pase y haga clic en el botón]. De forma predeterminada, el foco va a mi primer cuadro de texto y el usuario no pudo ver el texto predeterminado.

0

puede utilizar el método Tap también, que también está trabajando

private void tb1_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     tb1.Text = ""; 
    } 
0

Por favor, no complicar más la respuesta varias maneras de pelar un gato, pero, menos código mejor me presumiría.

La opción de Petermac es el camino a seguir para mí.

Agregar "GotFocus" en la ventana principal Xaml al control, por ejemplo. "Cuadro de texto"

private void Filename_GotFocus(object sender, RoutedEventArgs e) 
    { 
     Filename.Text = "";    
    } 

o me gusta esta opción

private void Filename_GotFocus(object sender, RoutedEventArgs e) 
    { 
     Filename.clear();    
    } 

la pregunta formulada era sólo para vaciar la caja de texto.

3

Para exponer sobre la respuesta de dona para que su campo será mantener el texto a las entradas del usuario a menos que sea estrictamente espacios en blanco, he aquí una solución que utilizo:

XAML

<TextBox Text="Search..." 
     Width="250" 
     Foreground="LightGray" 
     GotFocus="TextBox_GotFocus" 
     LostFocus="TextBox_LostFocus" /> 

C#

void TextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    TextBox box = sender as TextBox; 
    box.Text = string.Empty; 
    box.Foreground = Brushes.Black; 
    box.GotFocus -= TextBox_GotFocus; 
} 

void TextBox.LostFocus(object sender, RoutedEventArgs e) 
{ 
    TextBox box = sender as TextBox; 
    if(box.Text.Trim().Equals(string.Empty)) 
    { 
     box.Text = "Search..."; 
     box.Foreground = Brushes.LightGray; 
     box.GotFocus += TextBox_GotFocus; 
    } 
} 
Cuestiones relacionadas