WPF 带水印的RichTextbox简单实现

本文介绍了如何创建一个支持富文本的RichTextBox控件,通过自定义依赖属性检测文本内容,使用VisualBrush实现水印效果,当文本存在时隐藏水印,适用于WindowsForms应用。

平时做带水印的输入框都是基于textbox实现的,其实有时是需要支持富文本来实现,但是richtextbox 压根就没有text属性,所以就想办法做了一个带水印的richtextbox,直接上代码:
首先新建一个类继承RichTextBox,注册一个依赖属性用来判断是否有文本

public class HasTextRichTextBox : RichTextBox
    {
        static HasTextRichTextBox()
        {
            // 注册依赖属性
            HasTextProperty = DependencyProperty.Register("IsHasText", typeof(bool), typeof(HasTextRichTextBox));
        }

        public static readonly DependencyProperty HasTextProperty;

        public bool IsHasText
        {
            get { return (bool)GetValue(HasTextProperty); }
            set { SetValue(HasTextProperty, value); }
        }

        protected override void OnTextChanged(TextChangedEventArgs e)
        {
            base.OnTextChanged(e);
            // 更新IsHasText属性的值
            IsHasText = !IsRichTextBoxEmpty();
        }

        /// <summary>
        /// 判断内容是否为空
        /// </summary>
        /// <returns></returns>
        public bool IsRichTextBoxEmpty()
        {
            if (Document.Blocks.Count == 0)
                return true;
            TextPointer startPointer = Document.ContentStart.GetNextInsertionPosition(LogicalDirection.Forward);
            TextPointer endPointer = Document.ContentEnd.GetNextInsertionPosition(LogicalDirection.Backward);
            return startPointer.CompareTo(endPointer) == 0;
        }
    }

然后前台XAML进行引用,这里用VisualBrush来实现水印效果,然后根据自定义属性IsHasText来判断水印的出现时机,代码如下:

<Window x:Class="ProtobufTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
            <VisualBrush.Visual>
                <TextBlock FontStyle="Italic" Text="请说点什么吧..."/>
            </VisualBrush.Visual>
        </VisualBrush>
    </Window.Resources>
    <local:HasTextRichTextBox HorizontalAlignment="Left" VerticalAlignment="Top" Width="256" Margin="205,156,0,0">
        <local:HasTextRichTextBox.Style>
            <Style TargetType="local:HasTextRichTextBox">
                <Style.Triggers>
                    <Trigger Property="IsHasText" Value="True">
                        <Setter Property="Background" Value="{x:Null}"/>
                    </Trigger>
                    <Trigger Property="IsHasText" Value="False">
                        <Setter Property="Background" Value="{StaticResource HintText}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </local:HasTextRichTextBox.Style>
    </local:HasTextRichTextBox>
</Window>

至此实现完成,基本功能全部实现,不过现阶段有个不太严谨的判断,就是判断richtextbox内容为空的问题,有兴趣的朋友可以来私信交流

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值