时间:2015-08-04 17:56:35

标签: c# silverlight focus keyboardfocusmanager

设置: 我的用户界面中有一个RichTextBox包含hyperinkDropDownButton。现在,当我点击按钮DropDown打开并随后点击我的界面上的其他位置时,DropDown实现关闭,并检查它是否仍然拥有键盘焦点,以便它可以设置其{ {1}}在ToggleButton按预期崩溃后再次集中注意力。

问题: 在我的DropDown内部点击时,我将面临由我的方法检查焦点所有权导致的RichTextBox。对InvalidOperationException的调用适用于属于VisualTree的所有元素。显然,焦点VisualTreeHelper.GetParent(potentialSubControl)(由Hyperlink返回)不是VisualTree的一部分,因此是FocusManager.GetFocusedElement()的无效输入。那么,如何找到GetParent()中超链接的父级(逻辑父级或可视父级)?

我确定焦点所有权的方法:

RichTextBox

[编辑] 解决该问题的一个潜在想法:由于超链接是// inside DropDownButton.cs protected override void OnLostFocus( RoutedEventArgs e ) { base.OnLostFocus( e ); if (CloseOnLostFocus && !DropDown.IsFocused()) CloseDropDown(); } // inside static class ControlExtensions.cs public static bool IsFocused( this UIElement control ) { DependencyObject parent; for (DependencyObject potentialSubControl = FocusManager.GetFocusedElement() as DependencyObject; potentialSubControl != null; potentialSubControl = parent) { if (object.ReferenceEquals( potentialSubControl, control )) return true; try { parent = VisualTreeHelper.GetParent(potentialSubControl); } catch (InvalidOperationException) { // can happen when potentialSubControl is technically // not part of the visualTree // for example when FocusManager.GetFocusedElement() // returned a focused hyperlink (System.Windows.Documents.Hyperlink) // from within a text area parent = null; } if (parent == null) { FrameworkElement element = potentialSubControl as FrameworkElement; if (element != null) parent = element.Parent; } } return false; } 我可以尝试访问其inheritance context并在树中找到更高的其他DependencyObject并测试它们是{{1} }。但我很难在Silverlight中找到有关继承上下文的任何信息。

0 个答案:

没有答案