一、简单实例

//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获取选中部分内容的更多相关文章

  1. wpf ComboBox 获取选中项的文本内容

    一:根据数据源类型获取选中项 类: public class Region { public int REGION_ID { get; set; } public string REGION_CODE ...

  2. WPF DataGrid 获取选中 一行 或者 多行

    WPF中DataGrid使用时,需要将其SelectedItem转换成DataRowView进行操作 然而SelectedItem 与SelectedItems DataGrid的SelectionU ...

  3. c# WPF DataGrid 获取选中单元格信息

    private void Dg_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { Console.Write ...

  4. 【转】WPF DataGrid 获取选中的当前行某列值

    方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedE ...

  5. WPF DataGrid 获取选中的当前行某列值

    方法一: DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; ]ToString(); 方法二: var a = ...

  6. Android中Spanner获取选中内容和选中位置,根据位置选择对象

    作为一名菜鸟,关于spanner获取选中的内容文字代码,网上后很多 但是根据给出的位置来自动选择对象,这个代码一直没找到 后来找人问了问,才知道就一句话的事,特意在这里记录下 array.xml  X ...

  7. 【实践】获取CKEditor的html文本、纯文本、被选中的内容及赋值

      <%=Html.TextAreaFor(Model => Model.WORK_INTRODUCTION)%> <script type="text/javasc ...

  8. js获取select选中的内容

    ### 获取select选中的内容 js获取select标签选中的值 var obj = document.getElementById("selectId");//获取selec ...

  9. Jquery获取当前页面中的复选框选中的内容

    在使用$.post提交数据时,有一个数据是复选框获取数据,所以在当前页面获取到复选框选中的值并提交到后端卡住了一下,解决方法如下: 这两个input就是复选框的内容: str += "< ...

随机推荐

  1. java + spring (jython\python\script) Error:SyntaxError: no viable alternative at character '\n'

    使用Jython结合java和Python开发功能时,要是遇到如下情况: 2016-03-10 16:16:49 DEBUG [com.freedom.orion.configs.JyhtonConf ...

  2. Android 文件上传 使用AsyncHttpClient开源框架

    public void upload(View view) { AsyncHttpClient client = new AsyncHttpClient(); RequestParams reques ...

  3. HTML+js+css实现点击图片弹出上传文件窗口的两种思路

    第一种:CSS实现 <style><!-- .fileInputContainer{        height:256px;        background:url(upfil ...

  4. Erlang安装简介

    什么是 Erlang? Erlang 由 Ericsson (爱立信公司)开发,用于帮助开发管理许多电信项目的软件.Erlang 的第一个版本发布于 1986 年,1998 年发布了它的第一个开放源码 ...

  5. 14.6.3.3 Making the Buffer Pool Scan Resistant

    14.6.3.3 Making the Buffer Pool Scan Resistant 相比使用一个严格的LRU算法,InnoDB 使用一个技术来最小化数据总量 带入到buffer pool 而 ...

  6. 怎么打开Windows Server 2008 图片预览的功能?

    打开一个文件夹,点击菜单中的“工具”->“文件夹选项”,切换到“查看”选项卡,在高级设置中取消如下选项: “始终显示图标,从不显示缩略图” “在缩略图上显示文件图标”

  7. Linux学习笔记22——线程属性(转)

    本文来自博客园:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764204.html 一.线程属性线程具有属性,用pthread_at ...

  8. mysql 学习(1)

    1.从图中看到mysql是客户服务器模式. 2.我们如何操纵数据库? a.直接sql,各种编程语言, 3.客户端和服务器如何通信呢? 凡是c/s模式的都会自己的协议,但是都是基于TCP/IP协议,在l ...

  9. mac上的键盘生活——quicksliver

      昨天晚上一直在找mac上的博客客户端,没发现很好的国内支持客户端,却发现了一个新的东西--quicksliver 简单的说,这个就是个快捷键启动方式,这是我在mac上用的最好的一个快捷键启动程序( ...

  10. snatch

    https://www.imququ.com/post/use-berserkjs-in-mac.html http://www.one-lab.net/ http://www.oschina.net ...