问题: 当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的内容。