0

设置: 我的 UI 中有一个包含超链接和其他位置的RichTextBox。现在,当我单击按钮的打开然后单击 UI 上的其他位置时,将实现关闭,并检查它是否仍然拥有键盘焦点,以便在按预期折叠后再次将其设置为焦点。DropDownButtonDropDownDropDownToggleButtonDropDown

问题: 在我的内部单击时,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 中找到有关继承上下文的任何信息。

4

0 回答 0