.NET快速开发实践之应用IExtenderProvider实现输入法自动切换-阿里云开发者社区

开发者社区> agilelab> 正文

.NET快速开发实践之应用IExtenderProvider实现输入法自动切换

简介: 我在前面的.NET快速开发实践中的IExtenderProvider扩展组件和.NET快速开发实践之应用IExtenderProvider实现对象与UI控件的绑定两篇Post介绍了IExtenderProvider扩展编程模式和应用IExtenderProvider实现实体与对象的...
+关注继续查看

         我在前面的.NET快速开发实践中的IExtenderProvider扩展组件.NET快速开发实践之应用IExtenderProvider实现对象与UI控件的绑定两篇Post介绍了IExtenderProvider扩展编程模式和应用IExtenderProvider实现实体与对象的做法与例子,下面我为介绍一下在管理信息系统开发中一个常用的功能,输入法的切换,很多在线事务处理系统业务量非常的繁忙,在特定的某个时刻,比如在his应用中的挂号、收费,窗口业务中业务办理者排着长长的队,这样就对系统的办事速度有着严格的要求,软件UI上,有的地方需要在中文输入法状态输入汉字,但有的要求在非中文输入法状态中完成,比如数字类的输入,在中文状态下输入的是全角数字,在这种应用情况下,我们需求达到下图的效果:

         在容许输入中文的情况下,比如姓名,自动打开中文输入法:

T_F5V4QZ`F~1S%7KXE8(J}J

        而在非中文输入的情况下,如年龄,自动关闭中文输入法状态:

KY`HEU`79`[NWP{})4[WGGF

         那么,这样的需求我们如何实现呢,实现的方法或者很多,我只说IExtenderProvider扩展实现的方法,在AgileEAS.NET平台中集成了一个叫ChineseLanguageInput的小组件来完成这个功能,下面我就把ChineseLanguageInput的实现跟大家看看:

    [ToolboxItem(true)]
    [Description("输入法控件与自动切换组件")]
    [ProvideProperty("Language", typeof(Component))]
    public class ChineseLanguageInput:Component, IExtenderProvider
	{
        private Dictionary<Control, InputLanguage> inputLanguageList = new Dictionary<Control, InputLanguage>();
        private InputLanguage input = InputLanguage.CurrentInputLanguage;

		public ChineseLanguageInput()
		{
			
		}

        public ChineseLanguageInput(System.ComponentModel.IContainer container)
        {
            container.Add(this);
        }       

        [Category("输入法")]
        [Description("获取/设置控件的输入法状态")]
        public Language GetLanguage(Control component)
		{
			if( inputLanguageList.Contains( component ))
			{
				return (Language)inputLanguageList[ component ];
			}

            return Language.Default;
		}

        public void SetLanguage(Control component, Language c)
        {
            if (inputLanguageList.Contains(component) != true)
            {
                inputLanguageList.Add(component, c);
                System.Windows.Forms.Control currentC = (System.Windows.Forms.Control)component;
                currentC.Enter += new EventHandler(this.currentC_Enter);
            }
            else
            {
                inputLanguageList[component] = c;
            }
        }

        private void currentC_Enter(object sender, EventArgs e)
        {
            System.Windows.Forms.Control control = (System.Windows.Forms.Control)sender;

            if (this.GetLanguage(control) == Language.Chinese)
            {
                InputLanguage.CurrentInputLanguage = this.input;
            }
            else if (this.GetLanguage(control) == Language.English)
            {
                if (!object.Equals(InputLanguage.CurrentInputLanguage, InputLanguage.InstalledInputLanguages[0]))
                {
                    this.input = InputLanguage.CurrentInputLanguage;
                }

                InputLanguage.CurrentInputLanguage = InputLanguage.InstalledInputLanguages[0];
            }
        }

        #region IExtenderProvider 成员

        bool IExtenderProvider.CanExtend(object component)
        {
            return component is System.Windows.Forms.Control;
        }

        #endregion
    }

         这里还用到一个类型Language:

/// <summary>
    /// 输入法语言。
    /// </summary>
    public enum Language
    {
        /// <summary>
        /// 默认,不管他。
        /// </summary>
        Default = 0,

        /// <summary>
        /// 英文输入法状态。
        /// </summary>
        English = 1,

        /// <summary>
        /// 中文输入法状态。
        /// </summary>
        Chinese = 2     
    }

         上面就是ChineseLanguageInput组件的所有源码,怎么用呢,一样的方式,拖上面,在控件上设计输入法状态:

语言切换

         就弄到这吧,也不搞个demo了,组件源码都贴了,朋友们自己试吧。

QQ群:15118502

链接:AgileEAS.NET应用开发平台介绍

AgileEAS.NET之敏捷并行开发方法

敏捷软件工程实验室

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
PostgreSQL 使用逻辑decode实现异步主从切换后,时间线分歧变化量补齐、修复
PostgreSQL 使用逻辑decode实现异步主从切换后,时间线分歧变化量补齐、修复
405 0
【Swift】SpriteKit开发iOS游戏——场景切换
前言 Swift是个很不错的语言,苹果官方提供的游戏开发框架也很不错。 作为一个游戏来讲,里面的场景Scene肯定不止一个,所以需要切换场景 代码 代码从创建的时候的demo开始,demo的创建路径是 开始我们会有一个场景文件GameScene 所以我们要创...
1088 0
Android:随笔——RxJava的线程切换
转载请标明地址 QuincySx:[http://www.jianshu.com/p/d9da64774f7b] 近期用到 RxJava ,线程切换的时候出了点小插曲,首先先上理论,在上实践,不喜理论可跳过,此篇文章适合会使用 RxJava 的人...
561 0
深度学习在语音识别中的声学模型以及语言模型的应用
目前深度学习在图像和语音识别等领域应用越来越广泛,比如图像处理类应用、视频归纳、智能客服,以及延伸的服务机器人领域、车载助手等,本文着重介绍深度学习在语音识别中声学模型与语言模型中的应用,如FSMN,LSTM,RNN等网络结构的设计,比传统的结构在效果上有巨大的提升
9873 0
silverlight 窗体切换 与 窗体之间传值的实现
1.只有切換頁面 2.加上頁面傳值的功能 第一部份:切換頁面 同樣的先建立一個新的Silverlight專案 分別建立兩個User Control,並且名命為PageSwitcher、Page2   建立完成的結果 接著修改PageSwitcher.
797 0
+关注
agilelab
魏琼东,系统分析师、系统架构师、高级项目经理。有17年开发和管理经验,擅长企业软件过程改进、系统分析与架构设计、.NET平台架构技术、SQL Server/ORACLE数据库技术、分布式架构体系及高性能并行计算,尤其对中小软件企业的企业级软件研发管理体系有着深入的研究与应用。
116
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载