wpf小玩意之关键字文本框
有些时候,我们会碰到在输入文本时高亮一些文本关键字,譬如以下这图:

很明显,这个输入的文本中有四个关键字,正常文本都是黑色,关键字文本用了其他颜色。那么我们如何达到这种效果呢。wpf的textblock控件有个TextEffects属性,专门获取或设置用于此元素中的文本内容的效果,因此,可以用textblock来显示输入的文本,从而达到高亮文本的效果,显示的问题解决了,那文本的输入,编辑呢?由于textblock只是显示文本的控件,无法输入,编辑,所以我们要换一个思路,用一些巧妙的方法达到这种可编辑的高亮文本效果。
<ScrollViewer x:Class="KeyWordTextBox.KWTextBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
VerticalScrollBarVisibility="Auto"
>
<Grid>
<TextBlock LineHeight="" x:Name="tbk" Text="{Binding ElementName=tbx,Path=Text}" Padding="4,3,0,0" TextWrapping="Wrap"></TextBlock>
<TextBox TextChanged="tbx_TextChanged" SizeChanged="tbx_SizeChanged" x:Name="tbx" AcceptsReturn="True" TextWrapping="Wrap" Background="Transparent" Foreground="#00000000" BorderBrush="#00000000"
></TextBox>
</Grid>
</ScrollViewer>
在这里,我用了一个textbox和textblock控件分别用来文本编辑和文本显示,可以看到,这里是将textbox叠加到textblock上面,并且使得textbox透明,将textblock的Text绑定textbox的Text属性,从而使下面的textblock文本得以显示输入的文本。之后,我们只需要统一两个控件的文本位置,就能完成高亮文本的实现。
public List<Tuple<string, Brush>> Keys
{
get { return (List<Tuple<string, Brush>>)GetValue(KeysProperty); }
set { SetValue(KeysProperty, value); }
} // Using a DependencyProperty as the backing store for Keys. This enables animation, styling, binding, etc...
public static readonly DependencyProperty KeysProperty =
DependencyProperty.Register("Keys", typeof(List<Tuple<string, Brush>>), typeof(KWTextBox), new PropertyMetadata(new List<Tuple<string, Brush>>())); private void tbx_TextChanged(object sender, TextChangedEventArgs e)
{
tbk.Text = "";
tbk.TextEffects.Clear();
for (int i = ; i < tbx.LineCount; i++)
{
string a = tbx.GetLineText(i);
if (a.Contains("\r\n"))
{
a = a.Substring(, a.IndexOf("\r\n"));
}
if (i == )
{
tbk.Text += a;
}
else
{
tbk.Text += "\n" + a;
}
}
string s = this.tbk.Text;
int start = ;
foreach (var key in Keys)
{
start = ;
while (start < s.Length)
{
var i = s.IndexOf(key.Item1, start);
if (i != -)
{
TextEffect tex = new TextEffect()
{
Foreground = key.Item2,
PositionCount = key.Item1.Length,
PositionStart = i,
};
this.tbk.TextEffects.Add(tex);
start = i + key.Item1.Length;
}
else
{
break;
}
}
} } private void tbx_SizeChanged(object sender, SizeChangedEventArgs e)
{
tbx_TextChanged(sender, null);
}
以上就是在输入文本时触发的事件,也就是TextChange事件,在这里先使得textblock对齐textbox,之后再遍历文本,查找关键字,改变textblock的TextEffects属性。至此,这个小功能就基本完成了。
wpf小玩意之关键字文本框的更多相关文章
- [WPF]带下拉列表的文本框
控件我已经弄好了,代码比较多,所以没办法全面介绍. 一开始我是直接继承Selector类来实现,做是做出来了,不过发现性能不太好.于是,我就想着自己来实现.毕竟我是做给自己用的,也不考虑过多的东西,也 ...
- WPF里面制作圆角文本框
转自:http://www.cnblogs.com/mengxin523/archive/2010/04/04/1704448.html 本以为WPF里面的XAML会很强大,可以设置很多属性,比如文本 ...
- WPF——执行命令清空文本框
一.造一个窗体,在窗体里面先造一个StackPanel,然后再StackPanel里面放好按钮和文本框,注意给所有的控件和容器起名字 <Grid> <StackPanel Name= ...
- WPF强制设置TextBox文本框的焦点
在需求中遇到这样一种场景:就是在无论何时都要把焦点设置在一个TextBox中. 引用空间:System.Windows.Input 方式1:在窗体的Load事件中去设置焦点,(注意:不能在窗体的构造函 ...
- HTML之文本框关键字显示
文本框默认显示 "请输入关键字",当鼠标点击输入框的时候, "请输入关键字"这几个字消失,移出文本框又显示出来 <!DOCTYPE html> &l ...
- WPF 文本框添加水印效果
有的时候我们需要为我们的WPF文本框TextBox控件添加一个显示水印的效果来增强用户体验,比如登陆的时候提示输入用户名,输入密码等情形.如下图所示: 这个时候我们除了可以修改TextBox控件的控件 ...
- WPF文本框密码框添加水印效果
WPF文本框密码框添加水印效果 来源: 阅读:559 时间:2014-12-31 分享: 0 按照惯例,先看下效果 文本框水印 文本框水印相对简单,不需要重写模板,仅仅需要一个VisualBrush ...
- WPF编程:textbox控件文本框数据显示最后一行
WPF编程:textbox控件文本框数据显示最后一行 TextBox控件在接收大量数据的时候,滚动条一般在最上方,如何使滚动条随着数据的接收而向下滚动呢?比如有一个TextBox'控件txbRecvD ...
- WPF自定义控件之水印文本(密码)框
首先来讲讲创建这个控件的初衷,一个让我很郁闷的问题. 公司的客户端项目采用WPF+MVVM技术实现,在近期地推客户端的过程中遇到了一个很奇葩的问题:在登录界面点击密码框就会直接闪退,没有任何提示 密码 ...
随机推荐
- C#连接Oracle数据库的方法(System.Data.OracleClient、Oracle.DataAccess.Client也叫ODP.net、Oracle.ManagedDataAccess.dll)
官方下载地址(ODP.net)(中文):http://www.oracle.com/technetwork/cn/topics/dotnet/downloads/index.html 官方下载地址(O ...
- 【转载】Servlet中的request与response
一.HttpServletRequest概述 1.1.HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时, ...
- C语言中时钟编程
目录 C语言中时钟编程 1. 文章目的 2.基本概念 2.1 UTC时间 2.2 UNIX纪元时间 2.3 格林威治时间 (GMT) 3.时间转换 3.1 asctime函数 3.2 ctime函数 ...
- OBS直播和相关操作
OBS Studio(Open Broadcaster Software)是一个免费的开源的视频录制和视频实时流软件.其有多种功能并广泛使用在视频采集,直播等领域. https://obsprojec ...
- cd:切换目录
cd命令 1.命令详解 [功能说明] cd命令是“change directory”中每个单词的首字母缩写,其功能是从当前工作目录切换到指定的工作目录. [语法格式] cd [option] ...
- Ubuntu Server下docker实战 01: 安装docker
本系列文章主旨在于使用docker来搭建实际可用的基础服务,具体到每一步的操作和设置. 关于docker的原理.前世今生的内容,园子里已经有太多的文章了,此处就不再赘述. 要使用docker,当然第一 ...
- vue自定义拖动指令
1.在项目开发中,需要对div进行拖动.因为需要自定义组件 a>定义全局拖拽指令: 定义全局指令,需要在main.js中写入vue.directive('drag',{});即可.但是一般会在外 ...
- Git 基础教程 之 分支管理及策略
创建一个属于自己的分支,别人看不到,你在你自己的分支上干活, 想提交就提交,直至开发完毕后,再一次性合并到原来分支上.这样,既安全,又不影响他人工作. 在实际的开发过程中,应照几个基 ...
- 优化 RequireJS 项目(合并与压缩) 【已翻译100%】
英文原文:Optimize (Concatenate and Minify) RequireJS Projects 标签: RequireJS Node.js 参与翻译 (1人) : 裴宝亮 本文将演 ...
- Spring Cloud-Bus(十二)
说明 用于分布式上所有微服务都连接到消息总线上面.进行统一的通知 Config动态刷新 configClient configClient通过/actuator/bus-refresh端点通知消息总线 ...