设置:
我的用户界面中有一个RichTextBox包含hyperink和DropDownButton
。现在,当我点击按钮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中找到有关继承上下文的任何信息。