none
Marca de agua en textbox RRS feed

  • Pregunta

  • Se como crear marca de agua en textbox mediante los estilo lo que no se es como crearlo mediante de codigo, en estilo puedo dejar una marca de agua fija pero que pasa si dependiendo de ciertas situaciones la marca de agua cambie el texto que esta introducido 

     

    Se puede realizar esto o no?

    Saludos

    miércoles, 29 de junio de 2011 13:51

Respuestas

  • Hola!

    Para marcas de agua, uso un estilo que saca el texto de la propiedad Tag del TextBox, así puedes establecer esa propiedad en tiempo de ejecución o incluso enlazarla a una propiedad de tu código para cambiar la marca de agua, para aplicarlo solo tienes que indicarle el Style al TextBox que te interese:

      <Style x:Key="WatermarkTextBox" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
              <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
                <Grid>
                  <Label x:Name="TextPrompt" Content="{TemplateBinding Tag}" Visibility="Collapsed" Focusable="False" Foreground="DarkGray" Margin="0,-5,0,0"
                      FontSize="12" FontStyle="Italic"/>
                  <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Grid>
              </Microsoft_Windows_Themes:ListBoxChrome>
              <ControlTemplate.Triggers>
                <MultiTrigger>
                  <MultiTrigger.Conditions>
                    <Condition Property="IsFocused" Value="False"/>
                    <Condition Property="Text" Value=""/>
                  </MultiTrigger.Conditions>
                	<Setter Property="Visibility" TargetName="TextPrompt" Value="Visible"/>
                </MultiTrigger>
                <Trigger Property="IsEnabled" Value="false">
                  <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                  <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                </Trigger>
              </ControlTemplate.Triggers>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    

    Va muy rápido y funciona bastante bien, además es todo un estilo visual que no depende de código, propiedades adjuntas ni nada.

    Un gran saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    jueves, 30 de junio de 2011 5:44
    Moderador

Todas las respuestas

  • Hola Ricardo... mira este artículo donde crean una marca de agua en puro código como una Attached Property (Propiedad Adjunta). http://stackoverflow.com/questions/833943/watermark-textbox-in-wpf. Buscabas algo así?

     

    Saludos


    Antonio Lobo
    Mi Blog
    miércoles, 29 de junio de 2011 14:02
  • ¡Hola!
     
    No estiendo esta parte: "ciertas situaciones la marca de agua cambie el texto que esta introducido".
    Puedes crear un estilo con marca de agua y si lo necesitas lo cargas, y si no, cargas otro estilo sin marca de agua.
    C#
    Txt.Style = (Style)this.Resources["StyleMarcaAgua"];
    
     
    VB.Net
    Txt.Style = Ctype(me.Resources("StyleMarcaAgua"),Windows.Style);
    
    Un saludo,
    miércoles, 29 de junio de 2011 14:09
  • Hola!

    Para marcas de agua, uso un estilo que saca el texto de la propiedad Tag del TextBox, así puedes establecer esa propiedad en tiempo de ejecución o incluso enlazarla a una propiedad de tu código para cambiar la marca de agua, para aplicarlo solo tienes que indicarle el Style al TextBox que te interese:

      <Style x:Key="WatermarkTextBox" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
        <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorder}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
        <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
        <Setter Property="Template">
          <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
              <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true">
                <Grid>
                  <Label x:Name="TextPrompt" Content="{TemplateBinding Tag}" Visibility="Collapsed" Focusable="False" Foreground="DarkGray" Margin="0,-5,0,0"
                      FontSize="12" FontStyle="Italic"/>
                  <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Grid>
              </Microsoft_Windows_Themes:ListBoxChrome>
              <ControlTemplate.Triggers>
                <MultiTrigger>
                  <MultiTrigger.Conditions>
                    <Condition Property="IsFocused" Value="False"/>
                    <Condition Property="Text" Value=""/>
                  </MultiTrigger.Conditions>
                	<Setter Property="Visibility" TargetName="TextPrompt" Value="Visible"/>
                </MultiTrigger>
                <Trigger Property="IsEnabled" Value="false">
                  <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                  <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                </Trigger>
              </ControlTemplate.Triggers>
            </ControlTemplate>
          </Setter.Value>
        </Setter>
      </Style>
    

    Va muy rápido y funciona bastante bien, además es todo un estilo visual que no depende de código, propiedades adjuntas ni nada.

    Un gran saludo!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    jueves, 30 de junio de 2011 5:44
    Moderador
  • Hola Ricardo

    ¿Has resuelto el problema? Si es así recuerda marcar la respuesta correcta por favor!


    MCTS .NET Framework 3.5 Windows Forms Application Development
    MCTS .NET Framework 3.5 Windows Presentation Foundation
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter
    sábado, 2 de julio de 2011 7:25
    Moderador