WPF TextSelection获取选中部分内容
一、简单实例
//TextSelect继承自TextRange
TextSelection selection = richTextBox.Selection;
//1.获取选中内容
string result = selection.Text;
MessageBox.Show(result);
二、内容转自:WPF: 从TextSelection中获取Inline并且考虑部分选择的Run
FlowDocument的容器,比如RichTextBox,FlowDocumentReader,FlowDocumentPageViewer或者FlowDocumentScrollViewer类型都有一个Selection属性表示选择的区域。这个Selection属性就是一个TextSelection对象,继承自TextRange类型,这里很不爽的地方是当你想从这个TextSelection对象中获取选择区域的具体内容时,它只有一个Text属性,返回一个字符串,就是把所有选择区域的字符串提取出来,注意这个字符串不是纯文本的字符串,也可能是包含图片的RTF字符串,那么如果有用户自定义的InlineUIContainer控件什么的,完全被忽略。看了.NET内部的源代码,发现这里真的实现的很不好,具体可以参考内部类型TextRangeBase里的internal static string GetTextInternal(ITextPointer startPosition, ITextPointer endPosition, ref char[] charArray)方法,如下图:
代码逻辑是当遇到自定义UI对象时,直接加一个空格就完事了,简直可以用坑爹来形容,不能给InlineUIContainer加个接口什么的返回个有用的字符串吗?
为了解决问题,我们只能借助自己的方式来Selection中所有的Inline信息,来看示例程序,在FlowDocumentScrollViewer中选中一些内容:
输出:
OK!可以获取具体InlineUIContainer的信息,同时被部分选择的Run里的信息也被正确提取出来。
具体实现是这样的,首先枚举FlowDocument中的所有Inline(这里有再优化的余地,比如搞个类似折半查找的策略会更高效),然后通过TextRange的Contains方法,判断Inline的ContentStart和ContentEnd是否包含在TextRange中,这两个属性返回具体的TextPointer对象。这两个判断出结果后,执行下面的策略:
完全包含
处理Inline部分包含
如果Inline是Run,考虑Run从开头或者结尾被部分选择的情况完全不包含
如果Inline是Run,考虑Run中间被部分选择的情况
需要注意的地方:
1. TextPointer自己有CompareTo方法可以判断2个TextPointer的大小,这里可以判断出完全不包含的情况(每个TextElement对象都有位置属性返回TextPointer)。
2. “考虑Run从开头或者结尾被部分选择的情况”时可以通过TextPointer的GetTextInRun方法传入一个LogicalDirection枚举返回对应方向的部分选择字符串。
3. “考虑Run中间被部分选择的情况”时直接通过TextRange的Text属性就可以把字符串提取出来。
WPF TextSelection获取选中部分内容的更多相关文章
- wpf ComboBox 获取选中项的文本内容
一:根据数据源类型获取选中项 类: public class Region { public int REGION_ID { get; set; } public string REGION_CODE ...
- WPF DataGrid 获取选中 一行 或者 多行
WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作 然而SelectedItem 与SelectedItems DataGrid的SelectionU ...
- c# WPF DataGrid 获取选中单元格信息
private void Dg_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { Console.Write ...
- 【转】WPF DataGrid 获取选中的当前行某列值
方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedE ...
- WPF DataGrid 获取选中的当前行某列值
方法一: DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; ]ToString(); 方法二: var a = ...
- Android中Spanner获取选中内容和选中位置,根据位置选择对象
作为一名菜鸟,关于spanner获取选中的内容文字代码,网上后很多 但是根据给出的位置来自动选择对象,这个代码一直没找到 后来找人问了问,才知道就一句话的事,特意在这里记录下 array.xml X ...
- 【实践】获取CKEditor的html文本、纯文本、被选中的内容及赋值
<%=Html.TextAreaFor(Model => Model.WORK_INTRODUCTION)%> <script type="text/javasc ...
- js获取select选中的内容
### 获取select选中的内容 js获取select标签选中的值 var obj = document.getElementById("selectId");//获取selec ...
- Jquery获取当前页面中的复选框选中的内容
在使用$.post提交数据时,有一个数据是复选框获取数据,所以在当前页面获取到复选框选中的值并提交到后端卡住了一下,解决方法如下: 这两个input就是复选框的内容: str += "< ...
随机推荐
- Innodb和MyISAM比较
Innodb和MyISAM比较 (1)MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快 (2)MyISAM不支持事务.外键,InnoDB支持事务和外键 (3)MyISAM使用的表级锁 ...
- [cocos2d] 利用texture atlases生成动画
texturepacker可以方便地制作纹理贴图集(Texture Atlases),而且可以免费试用.(可在官网申请免费liscence) //利用软件将5帧png贴图生成1张大的png贴图和pli ...
- 精确到时分秒的jQuery插件例子
demo.html: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...
- 最好的JAVA IDE IntelliJ IDEA使用简介(一)—之界面元素
打开IDEA,(当第一次打开的时候出现的是一个欢迎页面,随便创建一个project来进入到IDEA的主界面),主界面显示如下: 主界面由6个主要区域组成(图中红色数字标注的) 1.菜单和工具栏 2.导 ...
- Intervals(差分约束)
http://poj.org/problem?id=1201 题意:给出N个整数区间[ai,bi],并且给出一个约束ci,( 1<= ci <= bi-ai+1),使得数组Z在区间[ai, ...
- Linux Kernel 'perf_event.c'本地权限提升漏洞
漏洞版本: Linux Kernel 3.11-rc4 漏洞描述: Linux Kernel是一款开源的操作系统 Linux Kernel 'perf_event.c'存在一个安全漏洞,允许本地攻击者 ...
- 网络流CodeForces. Original 589F:Gourmet and Banquet
A gourmet came into the banquet hall, where the cooks suggested n dishes for guests. The gourmet kno ...
- C++之拷贝构造函数
为什么要引入拷贝构造函数?(提出问题) 作用:创建一个对象的同时,使用一个已经存在的对象给另一个对象赋值 做比较:拷贝构造函数:对象被创建 + 用一个已经存在的对象 进行初始化 拷贝赋值函数:对象已 ...
- 公有云开启全面竞争时代——青云QingCloud
网界网本期[封面报道]公有云开启全面竞争时代 [CNW.com.cn 专稿] 险滩急流之后,公有云[注]服务市场的开拓者们终于看到了一片丰饶之海. 2013年,中国云计算[注]产业起步的第五年,公有云 ...
- hdoj 1285 确定比赛名次【拓扑排序】
确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...