前面给大伙儿简单介绍了RichEditBox控件的基本用法,以及解决其中的一些小问题。

本文咱们来看看如何自定义RichEditBox控件的上下文菜单。

原理比较简单,所以先说一说原理。当RichEditBox控件的上下文菜单即将弹出时,会引发ContextMenuOpening事件,我们需要处理该事件,并且将e.Handled属性设置为true,这样才能阻止默认上下文菜单的弹出。

首先,在RichEditBox控件上声明附加的菜单项,样板XAML如下:

        <RichEditBox Name="redit" ContextMenuOpening="OnContextMenuOpening">
<FlyoutBase.AttachedFlyout>
<MenuFlyout>
<MenuFlyoutItem Text="复制" Click="OnCopy"/>
<MenuFlyoutItem Text="剪切" Click="OnCut"/>
<MenuFlyoutItem Text="粘贴" Click="OnPaste"/>
<MenuFlyoutSeparator/>
<MenuFlyoutSubItem Text="字号">
<MenuFlyoutItem Text="16" Tag="16" Click="OnFontSize" />
<MenuFlyoutItem Text="20" Tag="20" Click="OnFontSize"/>
<MenuFlyoutItem Text="24" Tag="24" Click="OnFontSize" />
<MenuFlyoutItem Text="36" Tag="36" Click="OnFontSize"/>
<MenuFlyoutItem Text="48" Tag="48" Click="OnFontSize"/>
</MenuFlyoutSubItem>
<MenuFlyoutSeparator/>
<ToggleMenuFlyoutItem Text="加粗" Click="OnBold" />
<MenuFlyoutSeparator/>
<MenuFlyoutSubItem Text="下划线">
<MenuFlyoutItem Text="无" Tag="-1" Click="OnUnderline" />
<MenuFlyoutItem Text="单实线" Tag="0" Click="OnUnderline"/>
<MenuFlyoutItem Text="双实线" Tag="1" Click="OnUnderline"/>
<MenuFlyoutItem Text="虚线" Tag="2" Click="OnUnderline"/>
</MenuFlyoutSubItem>
</MenuFlyout>
</FlyoutBase.AttachedFlyout>
</RichEditBox>

通过FlyoutBase类的AttachedFlyout附加属性,可以将派出自FlyoutBase的弹出对象附加到任意的可视化对象上,由于这里咱们用的菜单,所以附加到RichEditBox控件的弹出对象为MenuFlyout实例。

处理ContextMenuOpening事件,阻止弹出默认的上下文菜单,然后,调用ShowAt方法在指定的坐标处打开菜单。

            e.Handled = true;
MenuFlyout menu = FlyoutBase.GetAttachedFlyout(redit) as MenuFlyout;
menu?.ShowAt(redit, new Point(e.CursorLeft, e.CursorTop));

前面在XAML文档中已通过FlyoutBase的AttachedFlyout附加属性设置了MenuFlyout对象,故此处通过 GetAttachedFlyout方法,可以获取到MenuFlyout实例的引用。

然后调用ShowAt方法来显示菜单,之所以会调用这个方法,是因为它可以自行指定菜单弹出的位置坐标值。ContextMenuOpening事件的参数e的CursorLeft和CursorTop属性可以得到当前指针的横坐标和纵坐标,再把坐标传给ShowAt方法即可以确定菜单弹出的位置。

下面代码处理文档的复制、剪切和粘贴功能。

        private void OnCopy(object sender, RoutedEventArgs e)
{
redit.Document.Selection.Copy();
} private void OnCut(object sender, RoutedEventArgs e)
{
redit.Document.Selection.Cut();
} private void OnPaste(object sender, RoutedEventArgs e)
{
// Paste方法带有一个整型参数,表示要粘贴的格式
redit.Document.Selection.Paste();
}

被编辑文档的Selection属性表示文档中正处于选择状态下的文本区域,通常上下文菜单只控制被选的文本,如果当前文档没有选定文本,那么选区就是插入光标所在的位置。

注意,在粘贴文本时,Paste方法需要一个整数值参数,指定粘贴的格式,0表示自动采用最优格式的文本,常常是RTF文本。有关格式的数值定义请自己参考https://msdn.microsoft.com/en-us/library/windows/desktop/ff729168(v=vs.85).aspx,MSDN是万能的。

最后是设置字号、加粗、下划线功能的实现。

        private void OnFontSize(object sender, RoutedEventArgs e)
{
MenuFlyoutItem item = sender as MenuFlyoutItem;
// 获取字号
float size = Convert.ToSingle(item.Tag); redit.Document.Selection.CharacterFormat.Size = size;
} private void OnBold(object sender, RoutedEventArgs e)
{
ToggleMenuFlyoutItem item = sender as ToggleMenuFlyoutItem;
redit.Document.Selection.CharacterFormat.Bold = item.IsChecked ? FormatEffect.On : FormatEffect.Off;
} private void OnUnderline(object sender, RoutedEventArgs e)
{
MenuFlyoutItem item = sender as MenuFlyoutItem;
int x = Convert.ToInt32(item.Tag);
UnderlineType unlinetp;
switch (x)
{
case -: // 无
unlinetp = UnderlineType.None;
break;
case : // 单实线
unlinetp = UnderlineType.Single;
break;
case : // 双实线
unlinetp = UnderlineType.Double;
break;
case : // 虚线
unlinetp = UnderlineType.Dash;
break;
default:
unlinetp = UnderlineType.None;
break;
}
redit.Document.Selection.CharacterFormat.Underline = unlinetp;
}

运行应用程序,最终效果如下。

OK,本次任务完成,3166。

示例源代码下载

【Win 10应用开发】在RichEditBox中使用自定义菜单的更多相关文章

  1. 《C#微信开发系列(2)-自定义菜单管理》

    2.0自定义菜单管理 ①接口说明 微信服务号聊天窗口下面的菜单项(有的公众号有启用有的则没有),这个可以在编辑模式简单配置,也可以在开发模式代码配置.微信公众平台开发者文档:微信公众号开发平台创建自定 ...

  2. 微信公众账号开发教程(四)自定义菜单(含实例源码)——转自http://www.cnblogs.com/yank/p/3418194.html

    微信公众账号开发教程(四)自定义菜单 请尊重作者版权,如需转载,请标明出处. 应大家强烈要求,将自定义菜单功能课程提前. 一.概述: 如果只有输入框,可能太简单,感觉像命令行.自定义菜单,给我们提供了 ...

  3. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  4. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  5. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  6. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  7. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  8. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  9. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

随机推荐

  1. 移动端之Android开发的几种方式的初步体验

    目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...

  2. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

  3. 在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验

    准备工作 本篇文章采用Mono+CentOS+Jexus的方式实现部署.Net的Web应用程序(实战,上线项目). 不懂Mono的请移步张善友大神的:国内 Mono 相关文章汇总 不懂Jexus为何物 ...

  4. windows下 安装 rabbitMQ 及操作常用命令

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...

  5. 浅谈Web自适应

    前言 随着移动设备的普及,移动web在前端工程师们的工作中占有越来越重要的位置.移动设备更新速度频繁,手机厂商繁多,导致的问题是每一台机器的屏幕宽度和分辨率不一样.这给我们在编写前端界面时增加了困难, ...

  6. 自建git node pm2 (不赘述,就说遇见的问题)

    //======================[git]部分 主题部分还是按照网上的办法进行安装. 安装的话  分为两个办法(一个是yum (contos办法)  或者sudo(ubuntu办法) ...

  7. MySQL:常见使用问题

    内容 1.Linux 上安装 MySQL 2.单机上安装多实例 3.不知root密码情况下,修改root密码 1.Linux 上安装MySQL 安装步骤: 1)解压 tar.gz文件 -linux-g ...

  8. Linux上课笔记--随手记Linux命令

    初次接触Linux就是感觉这系统不够友好不够人性化,因为首先接触电脑就是win,图形化界面什么操作都可以清晰看到.随着更多的接触越来越发现Linux的强大,虽然我只是一个小白,可我就是爱上他了.现在就 ...

  9. 用命令行工具创建 NuGet 程序包

    NuGet.exe 下载地址 本文翻译自: https://docs.nuget.org/Create/Creating-and-Publishing-a-Package https://docs.n ...

  10. 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置

    0x00 前言: 匹夫在日常和别人交流的时候,常常会发现一旦讨论涉及到“类型”,话题的热度就会立马升温,因为很多似是而非.或者片面的概念常常被人们当做是全面和正确的答案.加之最近在园子看到有人翻译的& ...