`
jiasongmao
  • 浏览: 667500 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

silverlight中Tab转Enter的实现方法

阅读更多

silverlight项目中要求界面全键盘操作,并且在光标移动到ComboBox时,下拉框要自动展开。原有的一个类无法实现光标移动到ComboBox时下拉框要自动展开,所以修改了一下,算是能满足要求了。

代码如下:

public class EnterToTab
    {
        private static List<Type> _ctrlTypes = new List<Type>()  
        {  
            typeof(TextBox),  
            typeof(PasswordBox),  
            typeof(CheckBox),  
            typeof(ComboBox), 
            typeof(Button),
            typeof(DropDown),
            typeof(DatePicker),
            typeof(AutoCompleteBox),
            typeof(HyperlinkButton),
            typeof(MaskedEdit),
        };
        public static void RegisterType(Type type)
        {
            if (!_ctrlTypes.Contains(type))
            {
                _ctrlTypes.Add(type);
            }
        }
        public static IEnumerable<T> FindChildren<T>(DependencyObject parent) where T : class
        {
            var count = VisualTreeHelper.GetChildrenCount(parent);
            if (count > 0)
            {
                for (var i = 0; i < count; i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    var t = child as T;
                    if (t != null)
                        yield return t;
                    var children = FindChildren<T>(child);
                    foreach (var item in children)
                        yield return item;
                }
            }
        }
        private UIElement _parent;
        private List<Control> _controls = new List<Control>();
        public EnterToTab(UIElement parent)
        {
            _parent = parent;
            // 如果控件还没有加载完就调用 Associate() 方法,则不能查找到子控件,  
            // 所以用定时器  
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromTicks(100);
            timer.Tick += new EventHandler(Timer_Tick);
            timer.Start();
        }
        void Timer_Tick(object sender, EventArgs e)
        {
            (sender as DispatcherTimer).Stop();
            Associate();
        }
        private bool _isAssociating = false;
        private void Associate()
        {
            if (_isAssociating) return;
            _isAssociating = true;
            try
            {
                // 清除原来关联过的  
                foreach (var c in _controls)
                {
                    c.KeyUp -= new KeyEventHandler(Control_KeyUp);
                }
                _controls.Clear();
                // 获取可以 Tab 的控件并加入到列表中  
                IEnumerable<Control> originals = EnterToTab.FindChildren<Control>(_parent);
                foreach (var c in originals)
                {
                    if (c.IsTabStop && c.Visibility == Visibility.Visible && c.IsEnabled)
                    {
                        var t1 = c.GetType();
                        foreach (var t2 in _ctrlTypes)
                        {
                            if (t1.IsAssignableFrom(t2))
                            {
                                c.KeyUp += new KeyEventHandler(Control_KeyUp);
                                _controls.Add(c);
                                break;
                            }
                        }
                    }
                }
                // 根据 TabIndex 的原始值排序  
                _controls.Sort(new TabIndexComparer());
            }
            finally
            {
                _isAssociating = false;
            }
        }
        void Control_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                Control source = (sender as Control);
                int index = _controls.IndexOf(source);
                if (e.Key == Key.Enter)
                {
                    if (index < _controls.Count - 1)
                    {
                        if (source is DropDown)
                        {
                            DropDown dropDown = source as DropDown;
                            dropDown.IsOpen = false;
                        }
                        _controls[index + 1].Focus();
                        if (_controls[index + 1] is ComboBox)
                        {
                            ComboBox nextCB = _controls[index + 1] as ComboBox;
                            nextCB.IsDropDownOpen = true;
                        }
                        if (_controls[index + 1] is DropDown)
                        {
                            DropDown nextDropDown = _controls[index + 1] as DropDown;
                            nextDropDown.IsOpen = true;
                        }
                    }
                }
            }
        }
        private class TabIndexComparer : IComparer<Control>
        {
            public int Compare(Control x, Control y)
            {
                if (x == y)
                {
                    return 0;
                }
                if (x.TabIndex <= y.TabIndex)
                {
                    return -1;
                }
                else
                {
                    return 1;
                }
            }
        }
    }
 
分享到:
评论

相关推荐

    silverlight控件实现立体翻转效果

    在本文中,我们将深入探讨如何使用Silverlight控件来实现立体翻转效果。Silverlight是一种由微软开发的富客户端技术,用于创建具有丰富媒体体验和交互性功能的Web应用程序。结合Visual Studio 2010和Blend 4,开发者...

    silverlight 中实现拖动的扩展方法

    ### Silverlight中实现拖动的扩展方法 #### 一、Silverlight简介与拖动功能的重要性 Silverlight是一款由微软开发的跨浏览器、跨平台的插件技术,它为Web应用程序提供了一个灵活的用户界面框架。Silverlight允许...

    Silverlight登陆注册翻转

    在Silverlight中实现登录注册翻转,开发者通常会利用XAML(Extensible Application Markup Language)来定义UI元素和布局,以及Storyboard来创建动画效果。XAML是一种声明式语言,用于描述用户界面的结构和样式,而...

    silverlight DataGrid 复杂表头的实现

    "silverlight DataGrid 复杂表头的实现"这个主题聚焦于如何在DataGrid中创建具有多层或者嵌套表头的复杂布局,以满足更高级别的数据统计和分析需求。 首先,我们需要了解Silverlight DataGrid的基本结构。DataGrid...

    silverlight视频聊天Demo

    在本文中,我们将深入探讨基于Silverlight技术实现的视频聊天Demo,这是一款适用于初学者学习和参考的应用实例。 首先,我们来了解Silverlight视频的核心技术。在Silverlight中处理视频主要依靠MediaElement控件,...

    Silverlight 旋转导航界面

    在“Silverlight 旋转导航界面”项目中,核心是利用Silverlight的动画和变换功能来实现界面元素的动态旋转效果。在Silverlight中,我们可以使用`Storyboard`来创建动画,通过定义开始和结束的关键帧,使对象在一定...

    Silverlight 项目在服务器中部署方法详解

    ### Silverlight项目在服务器中的部署方法详解 #### 一、Silverlight概述 Silverlight是由微软开发的一款用于创建丰富互联网应用程序(RIA)的技术平台。它基于XAML(Extensible Application Markup Language),...

    Silverlight Tab页

    在Silverlight中实现Tab页功能,开发者可以利用Silverlight Toolkit中的TabControl类或者自定义控件来达到目的。TabControl提供了标准的Tab项和内容区域,通过数据绑定和模板化来展示用户界面。开发者可以定制...

    silverlight打印实现方案源码

    此外,对于开发者来说,了解这些源码有助于提升对Silverlight打印机制的理解,从而在自己的项目中实现更高效、更灵活的打印解决方案。 总之,Silverlight的打印实现涉及到多个层面,包括UI元素的测量和布局、打印...

    silverlight 实现验证码的3种方法

    下面将详细介绍在Silverlight中实现验证码的三种方法。 ### 方法一:基于图像的随机数字与字母验证码 1. **生成随机字符**:首先,我们需要创建一个包含随机数字和字母的字符串。可以使用`Random`类来生成随机数,...

    silverlight多语言的实现

    本文将深入探讨如何在Silverlight项目中实现多语言支持。 首先,我们来看第一种实现多语言的方式:通过资源文件的绑定。在Silverlight中,我们可以使用ResourceDictionary来存储不同语言的文本资源。创建一个或多个...

    Silverlight实现各种统计图表

    总结来说,这个资源是一个关于Silverlight的统计图表库,主要用C#编写,可以帮助开发者快速在Silverlight应用中实现各种统计图表,提高数据可视化的效率和质量。通过博客中的示例和代码,开发者可以学习如何集成和...

    SilverLight实现三维旋转立方体

    在本文中,我们将深入探讨如何使用Silverlight 2.0技术实现一个三维旋转立方体的交互式图形。Silverlight是Microsoft推出的一种富互联网应用程序(RIA)框架,它为开发人员提供了一种创建具有丰富视觉效果和动态交互...

    Silverlight实现拖放功能

    在本文中,我们将深入探讨如何在Silverlight应用中实现拖放功能。Silverlight,作为微软开发的一个富互联网应用程序(RIA)平台,允许开发者创建交互性强、具有多媒体元素的Web应用程序。拖放功能是用户界面中常见的...

    silverlight--仪表盘的实现

    首先,让我们详细探讨Silverlight在实现仪表盘中的作用。Silverlight提供了丰富的UI控件和图形处理能力,可以构建出复杂的交互式用户界面。在本例中,Silverlight被用来设计和展示仪表盘的外观,包括指针、刻度、...

    Silverlight4 Filter实现

    在Silverlight中,滤镜是通过`Effect`类来实现的,这些效果基于WPF(Windows Presentation Foundation)的Effect模型。开发者可以使用内置的效果,如DropShadowEffect、BlurEffect等,或者自定义更复杂的特效。...

    Silverlight调用WebBrowser中HTML的JavaScript方法。

    在Silverlight应用中调用WebBrowser控件内的JavaScript函数,主要是通过WebBrowser控件的`InvokeScript`方法实现的。为了确保调用成功,需要关注控件加载状态、JavaScript函数的可访问性以及跨域策略的设置。这种...

    silverlight+Wcf实现登录

    2. **实现服务代理**:在Silverlight项目中,使用“添加服务引用”功能,指向WCF服务的地址,这将自动生成服务代理类,使得Silverlight客户端可以调用WCF服务的方法。 3. **编写WCF服务**:在另一个.NET项目中创建...

    Silverlight实现的图片放大效果

    在本文中,我们将深入探讨如何使用Microsoft的Silverlight技术实现图片的动态放大效果。Silverlight是一种基于.NET Framework的浏览器插件,它为Web应用程序提供了丰富的交互性和多媒体体验,包括图像处理功能。 ...

    silverlight中导入和导出Excel

    本文将详细探讨如何在Silverlight应用程序中实现Excel文件的导入与导出功能。 首先,Silverlight自身并不直接支持读写本地文件系统,包括Excel文件。因此,我们需要借助其他库或服务来实现这一目标。一种常见的方法...

Global site tag (gtag.js) - Google Analytics