Настройка: у меня есть 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.
System.Windows.Documents.Hyperlink
, который может встречаться внутриRichTextBox
, — это единственная вещь, которую я нашел до сих пор, которая может иметь фокус, но: не является производной отUIElement
и не является частью визуального дерева. Так что да, я испытываю это только с фокусом где-то внутриRichTextBox
. - person Martin   schedule 04.12.2015Inline
к владельцу, на котором он размещен. - person Martin   schedule 07.12.2015blah.parent as inline;
илиblah.parent as hyperlink
? - person Chris W.   schedule 10.12.2015DependencyObject
, который являетсяSystem.Windows.Documents.Hyperlink
(и я могу привести его к этому типу, если мне нужно), но у него нет свойстваParent
. Это моя проблема. - person Martin   schedule 21.12.2015