我有一个从 System.Windows.Controls.Control 派生的自定义 wpf 控件,它在大多数情况下都做得很好。
然而,有时在调用 UIElement.Focus() 的控件上调用 x.Focus() 会返回 false 并且不会聚焦控件。
经过一番挖掘,我发现
var x = control as FrameworkElement;
var focusable = x.Focusable; // -> true
var enabled = x.IsEnabled; // -> true
var visible = x.IsVisible; // -> FALSE <- !!! ARRGG
控件已渲染,我完全可以在 UI 中看到它。我尝试将 Focus() 的调用放到 Dispatcher,尝试在控件上调用 UpdateLayout() 都没有帮助。
最有趣的部分是,如果我使用 Snop 检查 IsVisible 属性,Snoop 会报告它为 True :)
我是否遗漏了一些明显的东西,在我的控制实现或其他地方?
编辑 22.11.2012
感谢到目前为止的评论,对于那些建议控件可能尚未完全呈现的评论
var x = control as FrameworkElement;
x.Dispatcher.Invoke(new Action(() =>
{
var isVisible = fe.IsVisible; // -> False
var focused = fe.Focus(); // -> False
}), DispatcherPriority.ApplicationIdle);
这也没有帮助。