RichEditBox控件支持对多格式文本进行编辑,一般的文本输入控件可以使用TextBox,不过,如果希望编辑格式较为复杂的文本,就可以考虚使用RichEditBox控件。

RichEditBox控件中正在编辑的文本是由Document属性公开的,它是一个ITextDocument接口,该接口没有公开实现类型,只能通过RichEditBox类的Document属性来获取其实例,Win App的API类似于COM的形式出现,所以某些类型只公开了接口,而没有公开实现类型。

ITextDocument接口的Selection属性可以获取到当前编辑框中被选定的文本区域,如果编辑框中的文本没有被选定,那么该属性所获取的是当前光标所在的位置。ITextSelection接口从ITextRange接口中继承了许多成员,比较常用的有:

ParagraphFormat属性——设置段落格式。

CharacterFormat属性——设置某个文本区域的格式,如加粗显示等。

Copy方法、Cut方法、Paste方法——可以进行复制、剪切、粘贴操作。

MoveStart方法、MoveEnd方法、Move方法——移动文本插入点。

InsertImage方法——在文档中插入图像。

下面老周用一些例子来演示一下如何设置编辑文档的格式。

一、设置字体大小:

            // 设置选定文本的字体大小
editbox.Document.Selection.CharacterFormat.Size = (float)val;

二、设置文本颜色:

            // 设置文本颜色
editbox.Document.Selection.CharacterFormat.ForegroundColor = c;

三、在文档中插入图像:

            FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".jpg");
picker.FileTypeFilter.Add(".png");
picker.FileTypeFilter.Add(".jpeg"); StorageFile file = await picker.PickSingleFileAsync();
// 打开文件流
IRandomAccessStream stream = await file?.OpenReadAsync();
// 插入图片
editbox.Document.Selection.InsertImage(, , , Windows.UI.Text.VerticalCharacterAlignment.Baseline, "图像", stream);

四、对文本应用加粗显示:

            // FormatEffect.Toggle表示切换状态
editbox.Document.Selection.CharacterFormat.Bold = Windows.UI.Text.FormatEffect.Toggle;

设置为Toggle表示切换状态,即如果文本已处于加粗状态,就设置为正常字体;如果文本尚未加粗,就进行加粗处理。

五、为文本设置下划线:

            ITextCharacterFormat format = editbox.Document.Selection.CharacterFormat;
if (format.Underline == UnderlineType.Single )
{
format.Underline = UnderlineType.None;
}
else
{
format.Underline = UnderlineType.Single;
}

从上面一堆例子也发现,其实RichEditBox用起来也不难,对号入座调用正确的成员就行。

但是,这个RichEditBox是一个问题控件,它有不少小问题。其中,比较突出的是:当为RichEditBox控件中选中的文本设置了字体颜色后,此时,把光标重新定位回RichEditBox控件,会发现字体又被恢复到原来的颜色,也就是说,我们对文本的颜色的修改无效。我相信这个问题不少人会遇到,在国外的一些技术社区也看到类似的提问。

造成这一问题的是元凶就是可视化状态,在RichEditBox的控件模板中声明了一个名为Focused的可视化状态,于是当控件获得焦点后会激活这个状态,并且把控件的前景色设置为默认的SystemControlForegroundChromeBlackHighBrush。

这是导致文本颜色设置后总是被还原的根源。

找到病因,就可以对症下药了。利用VS的XAML设计器为RichEditBox生成默认的控件模板,然后找到ControlTemplate里面根元素Grid下的VisualStateGroups组,接着找到CommonStates分组,你会看到里面有这么个可视化状态。

                                    <VisualState x:Name="Focused">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="PlaceholderTextContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlPageTextChromeBlackMediumLowBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="BackgroundElement">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlBackgroundChromeWhiteBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity" Storyboard.TargetName="BackgroundElement">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextControlBackgroundFocusedOpacity}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="BorderElement">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlHighlightAccentBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentElement">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundChromeBlackHighBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="RequestedTheme" Storyboard.TargetName="ContentElement">
<DiscreteObjectKeyFrame KeyTime="0" Value="Light"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>

其中,有一个时间线对象会引起你的注意,就是它:

<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentElement">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource SystemControlForegroundChromeBlackHighBrush}"/>
</ObjectAnimationUsingKeyFrames>

因为控件的Foreground属性的改变会影响编辑框中的文本,而当RichEditBox控件获得焦点时会激活Focused状态,这样的话,Foreground属性又被还原为默认值,从而把当前编辑文档的文本颜色也还原了。

所以,只要把这个ObjectAnimationUsingKeyFrames时间线去掉即可以解决问题,你如果不放心的话,可以先把它注释掉。

另外,RichEditBox还有一个问题,就是经常会发生无法将文本设置为斜体的情况,或者英文字母可以斜体,而中文字符不可用,又或者会出现加粗和斜体混在一起的问题。这个问题可能是字体的问题,老周暂时未找到解决方法。

最后,给大伙儿看一下上面例子的执行效果。

好,今天就扯到这里吧。

示例源代码下载

【Win 10应用开发】使用RichEditBox控件应注意的问题的更多相关文章

  1. 【Win 10应用开发】SplitView控件

    SplitView控件用于呈现分隔视图,简单地说,就是把一个视图分割为两部分,Content属性所表示的为主要视图,而Pane属性设置的视图则可以隐藏,可以折叠和展开. 估计文字是不太容易介绍这个控件 ...

  2. 【Win 10应用开发】在RichEditBox中使用自定义菜单

    前面给大伙儿简单介绍了RichEditBox控件的基本用法,以及解决其中的一些小问题. 本文咱们来看看如何自定义RichEditBox控件的上下文菜单. 原理比较简单,所以先说一说原理.当RichEd ...

  3. 背水一战 Windows 10 (79) - 自定义控件: Layout 系统, 控件模板, 事件处理

    [源码下载] 背水一战 Windows 10 (79) - 自定义控件: Layout 系统, 控件模板, 事件处理 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) ...

  4. python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐(二)

    在上一篇blog:python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 中介绍了python中的tkinter的一些东西,你可能对tkinter有一定的了解了.这篇b ...

  5. RS开发日期提示控件默认为昨天之进阶篇

    时隔<RS开发日期提示控件默认为昨天>这篇博文已经很久了,请原谅我隔了这么久才继续来写这篇笔记.也希望读到这篇笔记的朋友可以从这篇笔记中学习到一些关于RS日期控件和JS的一些应用知识,当然 ...

  6. Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全

    原文:Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全 前面简单学习了一些Android UI的一些基础知识,那么接下来我们一起来详细学习Android的 ...

  7. 基于Jquery WeUI的微信开发H5页面控件的经验总结(1)

    在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...

  8. 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)

    在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...

  9. WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用

    WinForm界面开发之布局控件"WeifenLuo.WinFormsUI.Docking"的使用 转自:http://www.cnblogs.com/wuhuacong/arch ...

随机推荐

  1. 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法

    在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常.   意思是出现了死循环,也就是Model之间有循环包含关系: ...

  2. 05.LoT.UI 前后台通用框架分解系列之——漂亮的时间选择器

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  3. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  4. PowerShell实现批量重命名文件

    [string]$FileName="E:\test11" #-------------------------------------- Clear-Host foreach($ ...

  5. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  6. nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证

    http模块内部封装了http服务器和客户端,因此Node.js不需要借助Apache.IIS.Nginx.Tomcat等传统HTTP服务器,就可以构建http服务器,亦可以用来做一些爬虫.下面简单介 ...

  7. C# 给word文档添加水印

    和PDF一样,在word中,水印也分为图片水印和文本水印,给文档添加图片水印可以使文档变得更为美观,更具有吸引力.文本水印则可以保护文档,提醒别人该文档是受版权保护的,不能随意抄袭.前面我分享了如何给 ...

  8. 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...

  9. 计算Div标签内Checkbox个数或已被disabled的个数

    先看下面的html: 计算div内的checkbox个数:$('#divmod input[type="checkbox"]').length 计算div内checkbox被dis ...

  10. Ubuntu1604下安装Liggghts及CFDEM Coupling

    部分内容参考http://www.linuxdiyf.com/linux/16315.html LIGGGHTS是一款开源的DEM软件,来自于著名的分子动力学软件LAMMPS,目前借助于CFDEM C ...