2012-05-03 14 views
8

Quiero crear un cuadro de texto, lo que tendría un texto gris "por defecto" aparece en ella, si esPermite convertir el texto "defecto" que aparezca en un cuadro de texto vacío sin enfoque utilizando XAML

a) vacío

b) perdió el foco

cuando el usuario ingresa al cuadro de texto, el texto gris "predeterminado" desaparecerá.

He intentado hacer esto usando ControlTemplate.Triggers, pero no puedo encontrar la propiedad HasFocus.

¿Cuál es la mejor manera de hacerlo con XAML?

+1

Me gustaría tener con @Fuji y sugerir el 'WatermarkTextBox', pero para referencia futura el equivalente' HasFocus' es 'IsKeyboardFocused' http://msdn.microsoft.com/en-us/library/system.windows.uielement.iskeyboardfocused.aspx –

Respuesta

16

Si bien no hay un beneficio real en la reinvención de la rueda, puede ser interesante ver cómo se puede hacer esto. La manera más fácil de hacer esto (en XAML puro) es crear un ControlTemplate para la TextBox que se superpone a una TextBlock cuando no está enfocada y no contiene texto:

<ControlTemplate TargetType="TextBox"> 
<Grid> 
    <TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBlock HorizontalAlignment="Center" 
       VerticalAlignment="Center" 
       Text="Your Prompt Here" 
       Margin="5,0,5,0" 
       Foreground="#FF808080" 
       FontStyle="Italic" 
       IsHitTestVisible="False" 
       x:Name="UserMessage" 
       Visibility="Hidden"/> 
</Grid> 
<ControlTemplate.Triggers> 
    <MultiTrigger> 
     <MultiTrigger.Conditions> 
      <Condition Property="Text" Value=""/> 
      <Condition Property="IsKeyboardFocusWithin" Value="False"/> 
      </MultiTrigger.Conditions> 
     <Setter Property="Visibility" TargetName="UserMessage" Value="Visible"/> 
    </MultiTrigger> 
</ControlTemplate.Triggers> 
</ControlTemplate> 

la MultiTrigger significa "establecer la visibilidad a Visible si la propiedad Text está vacío y el cuadro de texto no tiene el foco del teclado"

Si quieres que esto sea más reutilizable entonces se podría crear un control personalizado con esto, ya que es la plantilla predeterminada y con una propiedad de dependencia que contiene el mensaje de solicitud

+2

Estoy de acuerdo en que XAML puro es bueno si se usa raramente en una aplicación simple. Odio agregar dlls de terceros a proyectos a menos que se usen con frecuencia. – eandersson

+0

@fuji y es bueno entender cómo funcionan estas cosas en realidad! –

+0

@SteveGreatrex ¿cómo puedo crear un control personalizado para texto diferente, por ejemplo, Text = "Your Prompt Here", otro cuadro de texto? Necesito que el texto sea "You Prompt There". –

12

Simplemente puede usar Extended WPF Toolkit 's . enter image description here

Escribí una pequeña guía basada en su comentario sobre cómo agregar y usar la biblioteca en su proyecto.

Paso 1) Haga clic derecho en References en su proyecto y elija Add Reference.

Step 1

Paso 2) localizar e incorporar el archivo DLL WPFToolkit.Extended.dll.

Step 2

Paso 3) Última es necesario agregar el código XAML.

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <extToolkit:WatermarkTextBox Watermark="Enter First Name" /> 
    </Grid> 
</Window> 

La clave aquí es añadir el reference al archivo DLL.

xmlns:extToolkit="http://schemas.xceed.com/wpf/xaml/toolkit" 

Entonces simplemente puede usarlo en XAML de esta manera.

<extToolkit:WatermarkTextBox Watermark="Enter First Name" /> 
+0

¿En qué asamblea está? –

+0

Es una biblioteca personalizada que descarga desde el sitio que le he vinculado. http: //wpftoolkit.codeplex.com/releases/view/84227 – eandersson

+0

Sí, lo hice. Pero tendré que hacer referencia para obtener el cuadro de texto de marca de agua. Hay varias asambleas en esa biblioteca. ¿A cuál debería hacer referencia? –

Cuestiones relacionadas