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技术实现,在近期地推客户端的过程中遇到了一个很奇葩的问题:在登录界面点击密码框就会直接闪退,没有任何提示 密码 ...
随机推荐
- (转)基于Metronic的Bootstrap开发框架经验总结(1)-框架总览及菜单模块的处理
http://www.cnblogs.com/wuhuacong/p/4757984.html 最近一直很多事情,博客停下来好久没写了,整理下思路,把最近研究的基于Metronic的Bootstrap ...
- 虚拟DOM介绍
[转自]:https://www.jianshu.com/p/616999666920 为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.web ...
- Python标准模块--logging(转载)
转载地址:http://www.cnblogs.com/zhbzz2007/p/5943685.html#undefined Python标准模块--logging 1 logging模块简介 log ...
- python tips:匿名函数lambda
lambda用于创建匿名函数,下面两种函数定义方式等价. f = lambda x: x + 2 def f(x): return x + 2 立刻执行的匿名函数 (lambda x: print(x ...
- github+hexo(window10)
一.申请github账户 二.先安装node.js.git 本地: 三.安装hexo(建立静态网页,用Markdown写博客) 1.创建文件地址 在合适的地方新建一个文件夹,用来存放自己的博客文件,比 ...
- [Ynoi2011]D1T1
题目大意: 给定一个序列$a_1,a_2,\dots,a_n$,进行$m$次操作,每次操作如下: 1. 给定$x,y,z$,对所有下标为$y,y+x,y+2x,\dots$的元素加上$z$(保证$y\ ...
- js中二维数组的创建方法 2017-04-04 14:50 120人阅读 评论(0) 收藏
法一:var myarr=[[0,1,2],[1,2,3]]; 将[0,1,2]看做原来的0,将[1,2,3]看做原来的1,而二者又分别为子数组 如myarr[0][1]=1,myarr[1][1]= ...
- js实现cookie有效期至当次日凌晨
实际开发中有要求用户一些行为每天一次,次日开始重新回复功能,一般前端都是通过cookie来记住用户的操作,然后进行判断当日是否还有机会,这时候需要给存储的cookie值一个有效期,让次日自动失效,重新 ...
- 【Codeforces Round #519 by Botan Investments D】Mysterious Crime
[链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...
- Java代码模拟http请求的两种方式
z这里用百度地图的逆地理编码接口为例, 第一种方式:(通过jdk中的java.net包) 引入工具类 import java.net.URL; import java.net.URLConnectio ...