• .NET快速开发实践之应用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之敏捷并行开发方法

    敏捷软件工程实验室

  • 相关阅读:
    Eclipse 快捷键
    计算机网络之读Internet网发展史 读后感
    计算机网络之读Internet网发展史 读后感
    动态加载布局的技巧
    二、JSP的3个编译指令,7个动作指令,9个内置对象
    【杭电】[2050]折线分割平面
    【杭电】[2050]折线分割平面
    【杭电】[2068]RPG的错排
    【杭电】[2068]RPG的错排
    【杭电】[4500]小Q系列故事——屌丝的逆袭
  • 原文地址:https://www.cnblogs.com/eastjade/p/1800435.html
Copyright © 2020-2023  润新知