WPF 实现TextBox背景中提示文字(水印效果)

网上找到的多是使用VisualBrush,代码如下。单独使用方便,但加入样式模板文字内容无法绑定附加属性(或依赖属性)。

<TextBox HorizontalAlignment="Center" VerticalAlignment="Center" Width="100">
    <TextBox.Resources>
        <VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
            <VisualBrush.Visual>
                <TextBlock FontStyle="Italic" Text="提示文字"/>
            </VisualBrush.Visual>
        </VisualBrush>
    </TextBox.Resources>
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <Trigger Property="Text" Value="{x:Null}">
                    <Setter Property="Background" Value="{StaticResource HintText}"/>
                </Trigger>
                <Trigger Property="Text" Value="">
                    <Setter Property="Background" Value="{StaticResource HintText}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

本次找到的解决方法 附加属性+转换器+样式

可以多次使用,更改时只需要修改Watermark="背景文字"内容即可。

  • 附加属性
public class TextBoxHelper
    {
        #region Watermark
        public static string GetWatermark(DependencyObject obj)
        {
            return (string)obj.GetValue(WatermarkProperty);
        }

        public static void SetWatermark(DependencyObject obj, string value)
        {
            obj.SetValue(WatermarkProperty, value);
        }

        public static readonly DependencyProperty WatermarkProperty =
            DependencyProperty.RegisterAttached("Watermark", typeof(string), typeof(TextBoxHelper));


        #endregion
    }
  • textBox式样
<Style x:Key="HelperText" TargetType="{x:Type TextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border x:Name="BackBorder" SnapsToDevicePixels="true" Background="{TemplateBinding Background}"
                            CornerRadius="4"
                            BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}">
                            <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                        <TextBlock  x:Name="tbWatermark"
                                            Padding="2,0"
                                            Margin="{TemplateBinding Padding}"
                                            Foreground="{TemplateBinding Foreground}"
                                            FontSize="{TemplateBinding FontSize}"
                                            TextWrapping="Wrap"
                                            Focusable="False"
                                            IsHitTestVisible="False"
                                            Visibility="Collapsed"
                                            Text="{Binding Path=(local:TextBoxHelper.Watermark),RelativeSource={RelativeSource AncestorType=TextBox}, Mode=OneWay}"
                                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                            Opacity="0.3" />
                        <Border x:Name="underline" IsHitTestVisible="False" Background="Transparent" BorderBrush="#737B8C" BorderThickness="0 0 0 1" CornerRadius="4"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <DataTrigger Binding="{Binding Text,RelativeSource={RelativeSource Self},Converter={StaticResource IsNullOrEmptyConverter}}"
                                     Value="True">
                            <Setter Property="Visibility"
                                    TargetName="tbWatermark"
                                    Value="Visible" />
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  • 非空验证转换器
    #region String IsNullOrEmpty
    internal class IsNullOrEmptyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return string.IsNullOrEmpty((string)value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return DependencyProperty.UnsetValue;
        }
    }
    #endregion

xaml中使用

<TextBox Grid.Row="4" Style="{StaticResource HelperText}" Grid.Column="1" Height="24" Width="120" Res:TextBoxHelper.Watermark="背景文字"/>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF,可以通过设置TextBox控件的水印文本来实现添加背景字符。 以下是一个示例: ```xaml <TextBox Text="Enter text here..." Foreground="Gray" IsEnabled="{Binding IsTextBoxEnabled}" Style="{StaticResource MyTextBoxStyle}"/> ``` 其,Text属性设置了文本框默认的提示文本,Foreground属性设置了提示文本的颜色。IsEnabled属性用于控制文本框是否可编辑。 另外,还需要定义一个样式来设置提示文本的样式: ```xaml <Style x:Key="MyTextBoxStyle" TargetType="TextBox"> <Style.Resources> <VisualBrush x:Key="WatermarkBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None"> <VisualBrush.Visual> <TextBlock Text="Enter text here..." Foreground="Gray"/> </VisualBrush.Visual> </VisualBrush> </Style.Resources> <Setter Property="Background" Value="White"/> <Setter Property="BorderBrush" Value="Gray"/> <Setter Property="BorderThickness" Value="1"/> <Setter Property="Padding" Value="2"/> <Setter Property="Margin" Value="5"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type TextBox}"> <Grid> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True"/> <Border Background="{StaticResource WatermarkBrush}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True" Opacity="{Binding Path=Text.IsEmpty, Converter={StaticResource BooleanToVisibilityConverter}}"> </Border> <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> </Trigger> <Trigger Property="IsMouseOver" Value="True"> <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> </Trigger> <Trigger Property="IsKeyboardFocused" Value="True"> <Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> ``` 在样式,定义了一个VisualBrush作为提示文本的背景,使用了一个TextBlock作为VisualBrush的Visual元素,设置了文本和颜色。在控件模板,使用了两个Border元素,第一个用于显示文本框的背景和边框,第二个用于显示提示文本,通过Opacity属性来控制其显示和隐藏。最后,在控件模板添加了几个触发器来处理文本框的状态变化。 通过上述方式,就可以在WPF实现文本框添加背景字符的效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值