设置:
我的 UI 中有一个包含超链接和其他位置的RichTextBox。现在,当我单击按钮的打开然后单击 UI 上的其他位置时,将实现关闭,并检查它是否仍然拥有键盘焦点,以便在按预期折叠后再次将其设置为焦点。DropDownButton
DropDown
DropDown
ToggleButton
DropDown
问题:
在我的内部单击时,RichTextBox
我将面临InvalidOperationException
由我检查焦点所有权的方法引起的问题。VisualTreeHelper.GetParent(potentialSubControl)
对作为 VisualTree 一部分的所有元素的调用都可以正常工作。显然,焦点Hyperlink
(由 返回FocusManager.GetFocusedElement()
)不是 VisualTree 的一部分,因此对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;
}
[编辑] 解决该问题的一个潜在想法:由于 Hyperlink 是一个DependencyObject
我可以尝试访问它的继承上下文并在树中找到其他DependencyObjects
更高的内容并测试它们是否存在FrameworkElements
。但我很难在 Silverlight 中找到有关继承上下文的任何信息。