我有一个Silverlight DataGrid,我需要检查它是否有Focus。我知道有一种方法可以为GotFocus设置Focus和一个事件,但是看不到任何用于检查它是否有焦点的方法。
任何想法?
答案 0 :(得分:3)
AFAIK没有直接的方法或属性来检查它是否有焦点,但你应该能够使用FocusManager.GetFocusedElement()。
如果你定义了一个扩展方法,你应该可以调用MyDataGrid.HasFocus():
public static class ControlExtensions
{
public static bool HasFocus(this Control aControl)
{
return System.Windows.Input.FocusManager.GetFocusedElement() == aControl;
}
}
[编辑:我现在测试了它:] 但是有一个问题:调用GetFocusedElement()可以返回DataGrid中当前的焦点单元格。因此,在这种情况下,HasFocus将返回false。
为了能够检查DataGrid或其中一个单元格是否聚焦,我们可以像这样调整我们的扩展方法
public static class ControlExtensions
{
public static bool HasFocus(this Control aControl, bool aCheckChildren)
{
var oFocused = System.Windows.Input.FocusManager.GetFocusedElement() as DependencyObject;
if (!aCheckChildren)
return oFocused == aControl;
while (oFocused != null)
{
if (oFocused == aControl)
return true;
oFocused = System.Windows.Media.VisualTreeHelper.GetParent(oFocused);
}
return false;
}
}
希望这有点帮助?