平时做带水印的输入框都是基于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内容为空的问题,有兴趣的朋友可以来私信交流
本文介绍了如何创建一个支持富文本的RichTextBox控件,通过自定义依赖属性检测文本内容,使用VisualBrush实现水印效果,当文本存在时隐藏水印,适用于WindowsForms应用。
580





