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技术实现,在近期地推客户端的过程中遇到了一个很奇葩的问题:在登录界面点击密码框就会直接闪退,没有任何提示 密码 ...
随机推荐
- 安卓代码迁移:Make.exe: *** [***.o]Error 1
描述:NDK开发中显示,windows环境下NDK开发 解决办法:查找系统环境变量,找到关于Cygwin的环境变量或其他无效的环境变量删除处理.
- Visual Studio 推荐插件以及一些设置
Microsoft Visual Studio 作为微软自家的 IDE 集成 NuGet 包管理器,是的引用一些不同版本组件DLL十分方便. 集成编译环境,强大的 Debug 断点.附加功能 项目模板 ...
- redis与其可视化工具在win7上的安装
步骤 1.下载安装Redis服务. 2.调用执行文件创建服务器以及测试缓存. 3.使用可视化工具redis-desktop-manager管理查询缓存. 1.下载安装Redis服务. 下载地址:htt ...
- php常用字符串和例子
//输出一个或多个字符串 //注:echo 不是一个函数(它是一个语言结构), 因此你不一定要使用小括号来指明参数,单引号,双引号都可以 $a = "admin1"; $b = & ...
- 【转载】intellij idea如何将web项目打成war包
1.点击[File]->[Project Structure]菜单(或使用Shift+Ctrl+Alt+S快捷键),打开[Project Structure]窗口.如下图: 2.在[Projec ...
- 机器学习K-Means
1.K-Means聚类算法属于无监督学习算法. 2.原理:先随机选择K个质心,根据样本到质心的距离将样本分配到最近的簇中,然后根据簇中的样本更新质心,再次计算距离重新分配簇,直到质心不再发生变化,迭代 ...
- [系统资源攻略]IO第一篇-磁盘IO,内核IO概念
几个基本的概念 在研究磁盘性能之前我们必须先了解磁盘的结构,以及工作原理.不过在这里就不再重复说明了,关系硬盘结构和工作原理的信息可以参考维基百科上面的相关词条--Hard disk drive(英文 ...
- 51nod1081 子段求和
给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和. 例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1.3 + 7 + 9 = ...
- svn版本库更新后自动同步到www
注意:www目录一定要用SVN服务器 checkout出Repositories的代码 步骤: (1)新建www根目录 mkdir -p /data/www/lehuo (2)在www根目录下检出(c ...
- JAVA关键技术
通用技术方面 MVC 1)概念 MVC是一个架构模式,它分离了表现与交互.它被分为三个核心部件:模型-model.视图-view.控制器-controller 2)工作原理 所有的终端用户请求被发送到 ...