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

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

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

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

         那么,这样的需求我们如何实现呢,实现的方法或者很多,我只说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了,组件源码都贴了,朋友们自己试吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Google Dart

AngularDart Material Design 日期选择器 顶

当用户键入日期时,将专门处理具有2位数年份的日期。 例如。7/7/77被解释为1977年7月7日,而不是77年7月7日。这个逻辑看起来是未来20年:现在(201...

24330
来自专栏前端说吧

小程序学习笔记

53550
来自专栏听雨堂

Log4Net与Log2Console配合时中文问题的解决

二者搭配,非常好用,但必须要用log4net.Layout.XmlLayoutSchemaLog4j才能有效果:区分不同的级别,把不同的属性列都显示出来… ...

28270
来自专栏前端架构

vue2.x入坑总结—回顾对比angularJS/React的一统

从感性的角度讲,我是不屑于用VUE,觉得react套件用起来更顺手,但是vue现在越来火,所以也不得入vue(杂烩汤)的坑。

16520
来自专栏Google Dart

AngularDart 4.0 高级-生命周期钩子 顶

Angular创建它,渲染它,创建和渲染它的子项,在数据绑定属性发生变化时对其进行检查,并在将它从DOM中删除之前对其进行销毁。

12410
来自专栏debugeeker的专栏

xss渗透试验(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

10110
来自专栏大数据钻研

Web前端中的命名规则

规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范...

54490
来自专栏贾鹏辉的技术专栏@CrazyCodeBoy

React Native Android原生模块开发实战|教程|心得

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://www.devio.org) 告诉大家一个好消息,为大家精心准备的React N...

63140
来自专栏Windows Community

Extensions in UWP Community Toolkit - Overview

概述 UWP Community Toolkit  中有一个 Extensions 的集合,它们可以帮助开发者实现很多基础功能,省去自己造轮子的过程,本篇我们先...

408120
来自专栏Python绿色通道

Python爬虫:现学现用xpath爬取豆瓣音乐

爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能

23030

扫码关注云+社区

领取腾讯云代金券