Найдите родительский RichTextBox из сфокусированной гиперссылки внутри

Настройка: у меня есть RichTextBox, содержащий гиперссылка и 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;
}

[Изменить] Одна потенциальная идея для решения проблемы: поскольку гиперссылка является DependencyObject, я могу попытаться получить доступ к ее контекст наследования, найдите другие DependencyObjects выше в дереве и проверьте их на FrameworkElements. Но я изо всех сил пытаюсь найти какую-либо информацию о контексте наследования в Silverlight.


person Martin    schedule 04.08.2015    source источник
comment
эй, амиго, видел твое сообщение, сейчас я мотаюсь по странам во время отпуска, я посмотрю, как только смогу устроиться где-нибудь не только с телефоном, но может быть задержка, извините за время, чувак. Надеюсь, кто-нибудь придет раньше меня, кто не пил. ;)   -  person Chris W.    schedule 04.08.2015
comment
@ChrisW.: Спасибо, я буду терпелив. Пока я могу жить с блоком try-catch. Это просто не правильное решение. Это похоже на обмотку изолентой отрубленной ноги, чтобы никто не заметил.   -  person Martin    schedule 05.08.2015
comment
Хм, мне было бы любопытно, какова общая цель UX, потому что я, вероятно, мог бы показать вам, как добиться этого с немного меньшей сложностью и позволить вам больше владеть структурой управления. Я сегодня в Мюнхене, а завтра уезжаю в другую страну, у вас все еще есть моя личная электронная почта с того времени? [email protected]? Мы можем сделать это в автономном режиме, но меня не будет дома некоторое время, поэтому ожидайте ответа с задержкой. Ваше здоровье!   -  person Chris W.    schedule 08.08.2015
comment
@ChrisW.: Не могу найти электронное письмо в папке отправленные. Ну, то, что я пытаюсь выполнить, сводится к следующему: в любой произвольно выбранный момент времени (какое-то событие FocusLost или событие DropDownClosed) и для любого заданного элемента моего дерева пользовательского интерфейса мне нужно иметь возможность проверить с помощью метода расширения, если это очень элемент сфокусирован. Моя текущая реализация задыхается от сфокусированных гиперссылок.   -  person Martin    schedule 14.08.2015
comment
Вы испытываете это только тогда, когда ваш фокус находится внутри RichTextBox или в другом месте?   -  person Chris W.    schedule 03.12.2015
comment
System.Windows.Documents.Hyperlink, который может встречаться внутри RichTextBox, — это единственная вещь, которую я нашел до сих пор, которая может иметь фокус, но: не является производной от UIElement и не является частью визуального дерева. Так что да, я испытываю это только с фокусом где-то внутри RichTextBox.   -  person Martin    schedule 04.12.2015
comment
Я. вы должны посмотреть на Inline как на родителя и найти его как дочерний элемент. Сегодня у меня куча дел, но я посмотрю, не смогу ли я найти немного времени, чтобы поделиться концепцией.   -  person Chris W.    schedule 04.12.2015
comment
Я не нашел способа перейти от элемента Inline к владельцу, на котором он размещен.   -  person Martin    schedule 07.12.2015
comment
Продолжайте возвращаться к этому, я собираюсь снова отследить вашу электронную почту в папке «Исходящие», чтобы мы могли больше работать в автономном режиме. В любом случае, вы не можете ударить даже blah.parent as inline; или blah.parent as hyperlink?   -  person Chris W.    schedule 10.12.2015
comment
Во время выполнения, когда я извлекаю текущий сфокусированный элемент, я получаю экземпляр DependencyObject, который является System.Windows.Documents.Hyperlink (и я могу привести его к этому типу, если мне нужно), но у него нет свойства Parent. Это моя проблема.   -  person Martin    schedule 21.12.2015