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属性就可以把字符串提取出来。

时间: 2024-12-17 16:52:26

WPF TextSelection获取选中部分内容的相关文章

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

方法一:DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedElement.Row[0]ToString(); 方法二:var a = this.dataGrid1.SelectedItem; var b = a as DataRowView;string result = b.Row[0].ToString(); [转]WPF DataGrid 获取选中的当

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

方法一: DataRowView mySelectedElement = (DataRowView)dataGrid1.SelectedItem; string result = mySelectedElement.Row[0]ToString(); 方法二: var a = this.dataGrid1.SelectedItem; var b = a as DataRowView; string result = b.Row[0].ToString();

wpf datagrid根据多选选中的获取单元格内容,进行操作数据

private void Button_Click(object sender, RoutedEventArgs e)        {            var vLst = this.dgList.SelectedItems;            for (int i = 0; i < vLst.Count; i++)            { 1.//获取选中的数据                string str = (dgList.Columns[1].GetCellConte

在WPF中获取DataGridTemplateColumn模板定义的内容控件

xaml格式描述: <DataGrid Name="dataGrid" Grid.Row="1" ItemsSource="{Binding}"  >            <DataGrid.Columns>              <DataGridTemplateColumn Header="描述">                    <DataGridTemplateCo

javascript 获取光标所选中的内容并插入到另一个文本框中(兼容ie和ff)

项目中正好用到 做下笔记方便以后查找 ie获取光标的位置使用document.selection.createRange() 火狐下使用document.getElementById(id).selectionStart 和 document.getElementById(id).selectionEnd 假设我们要获得id为txt的Textarea元素里面光标所选择的内容 首先创建一个获得光标所选内容的函数(参数:火狐下需要Dom元素 select_field=document.getElem

【WPF学习】第二十章 内容控件

原文:[WPF学习]第二十章 内容控件 内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主要愿意可以包含任意多个牵头元素. 正如前面所介绍,所有WPF布局容器都继承自抽象类Panel,该类提供了对包含多个元素的支持.类似地,所有内容控件都继承自抽象类ContentControl.下图显示了ContentControl类的层次结构. 图 Conten

js如何获取选中radio单选按钮的值

js如何获取选中radio单选按钮的值:radio单选按钮在是非常常用的表单元素之一,经常需要获取被选中按钮的value属性值,下面就通过实例简单介绍一下如何使用javascript实现此功能,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.soft

jQuery分别获取选中的复选框值

function jqchk(){  //jquery获取复选框值   var s='';   $('input[name="aihao"]:checked').each(function(){     s+=$(this).val()+',';   }); 点击“提交”后,可以得到正确的选择值了,但是后面多一个,(英文逗号),这个可以检测一下再用substring去除,或者获取到复选框选择值后一般都要转成数组再使用的,所以也可以在转成数组后,去除最后一个数组元素. if (s.len

ztree获取选中节点时不能进入可视区域出现BUG如何解决

zTree 是一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 的特点编辑 ● zTree v3.0 将核心代码按照功能进行了分割,不需要的代码可以不用加载● 采用了延迟加载技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀● 兼容 IE.FireFox.Chrome.Opera.Safari 等浏览器● 支持 JSON 数据● 支持静态和 Ajax 异步加载节点数据● 支持任意更换皮肤 / 自定义图