C# 解决为TextBox后台动态添加水印的问题

       最近在做WPF,有个需求需要动态生成TextBox,实现很简单,只需要把TextBox动态添加到ListBox中就可以了。后来对方说要在TextBox中显示水印,想了很多办法。

      首先WPF中我并没有发现可以直接使用水印的方法,其次网上的很多教程都是写在前端(XAML定义)的,而且是每一个TextBox都需要定义对应的style,对于后台代码实现起来很麻烦。因此对于动态加载的TextBox不易实现水印。

          在查了很多网上的资料后,我发现一种方法我可以借鉴。

<ControlTemplate x:Key="WaterMarkTextBox" TargetType="{x:Type TextBox}">
                                <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
                                        BorderThickness="{TemplateBinding BorderThickness}" 
                                        Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                    <Grid>
                                        <ScrollViewer x:Name="PART_ContentHost" Focusable="False" 
                                                      HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>

                                        <TextBlock x:Name="InternalWatermarkLabel" 
                                                   Text="{TemplateBinding Tag}"
                                                   FontStyle="Italic"
                                                   Visibility="Collapsed" Focusable="False"
                                                   Foreground="Silver"/>
                                    </Grid>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <MultiTrigger>
                                        <MultiTrigger.Conditions>
                                            <Condition Property="IsFocused" Value="False" />
                                            <Condition Property="Text" Value="" />
                                        </MultiTrigger.Conditions>
                                        <MultiTrigger.Setters>
                                            <Setter Property="Visibility" TargetName="InternalWatermarkLabel" Value="Visible" />
                                        </MultiTrigger.Setters>
                                    </MultiTrigger>
                                    <Trigger Property="IsEnabled" Value="False">
                                        <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                                    </Trigger>
                                    <Trigger Property="IsMouseOver" Value="True">
                                        <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
                                    </Trigger>
                                    <Trigger Property="IsKeyboardFocused" Value="True">
                                        <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>

<TextBox Grid.Row="0" Grid.Column="1" Margin="0,15" Text="abcdefg" x:Name="tb_PassPhrase" VerticalAlignment="Center"
                                 Tag="Pass Phrase" Template="{DynamicResource WaterMarkTextBox}">
                        </TextBox>

  


       如上先定义一段资源样式,在TextBox中只需要使用 Tag和Template就可以完成水印的功能,而且后台代码很容易实现。具体实现如下:

      1、先在前台使用XAML定义这段样式

      

 <Grid.Resources>

            <ControlTemplate x:Key="WaterMarkTextBox" TargetType="{x:Type TextBox}">
                <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
                                        BorderThickness="{TemplateBinding BorderThickness}" 
                                        Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <Grid>
                        <ScrollViewer x:Name="PART_ContentHost" Focusable="False" 
                                                      HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>

                        <TextBlock x:Name="InternalWatermarkLabel" 
                                                   Text="{TemplateBinding Tag}"
                                                   FontStyle="Italic"
                                                   Visibility="Collapsed" Focusable="False"
                                                   Foreground="Silver"/>
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsFocused" Value="False" />
                            <Condition Property="Text" Value="" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Visibility" TargetName="InternalWatermarkLabel" Value="Visible" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                    </Trigger>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="True">
                        <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>

        </Grid.Resources>
2、后台只需在new TextBox时,添加tag和Template的属性即可。

   

 TextBox tb = new TextBox();
                tb.Width = 200;
                tb.Tag = Tishi[i];
                tb.SetResourceReference(TextBox.TemplateProperty, "WaterMarkTextBox");
Tag就是水印的内容,WaterMarkTextBox就是引用的资源Key。



这样就可以了,并不是老手,如果表达欠妥,请多多批评和指正。




          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值