none
分享TextBox控件丧失焦点(输入光标异常)的问题和解决 RRS feed

  • 常规讨论

  • 问题: 当TextBox被重置内容和设置焦点两次之后,可以看到光标闪动,无法输入内容。

     

    private void focus(Window window)
                {
                    //下面给出定义
                    this.Source.Remove(window);
                    this.Source.Add(window);
                    window.IsMinimized = false; //下面给出定义
                    window.ApplyTemplate(); //继承自Control
                }

    public UIElementCollection Source
                {
                    get { return source; }
                    set
                    {
                        // 现在只支持设置一次,其实也够了。 (这里就是发生问题的关键)
                        if (source == null)
                        {
                            source = value;
                           
                            var windows = new Window[source.Count];

                            //其实问题就出在下面这两句,当拷贝控件去后,造成我们实际使用的是一个被Clear()的一个引用,一旦这个引用不被反复重置,焦点将永久失去,不知道算不算BUG。这个问题也让我们明白一个道理,当一个人自信的时候就是他容易犯错误的时候,我是通过这个注释:“// 现在只支持设置一次,其实也够了。”找到BUG的所在,可以说,在一个有几W行代码的工程,被独立封装的N个控件里找这么一个BUG犹如大海捞针……

                            source.CopyTo(windows, 0);
                            source.Clear();

                            foreach (Window window in windows)
                            {
                                this.Add(window);
                            }
                        }
                    }
                }

     

    /// <summary>
            /// 获取或设置一个布尔值指示当前窗口是否处于最小化状态。
            /// </summary>
            public bool IsMinimized
            {
                get { return isMinimized; }
                set
                {
                    if (isMinimized != value)
                    {
                        isMinimized = value;
                        if (isMinimized)
                        {
                            this.Visibility = Visibility.Collapsed;
                            if (this.Minimized != null)
                            {
                                this.Minimized(this, new EventArgs());
                            }
                        }
                        else
                        {
                            this.Visibility = Visibility.Visible;
                        }
                    }
                }
            }

     

    虽然无法贴出完整源码,但是,这里的代码已经应该能说明问题了吧? 在找这个BUG的时候还发现了一个问题,原先,我以为OnTemplateApply这个事件处理函数里的代码对于UI线程不安全,但是,实践证明,是安全存在于UI线程中的,可以合法操作UI的内容。

    2008年9月15日 17:54