設定:ハイパーリンク
を含むRichTextBoxとUI の別の場所があります。ボタンをクリックして開いた後、UI の別の場所をクリックすると、閉じるように実装され、キーボードフォーカスがまだ所有されているかどうかを確認して、意図したとおりに折りたたんだ後に再びフォーカスを設定できるようにします。DropDownButton
DropDown
DropDown
ToggleButton
DropDown
問題:
内部をクリックすると、フォーカスの所有権を確認する方法が原因でRichTextBox
あることに直面します。InvalidOperationException
への呼び出しVisualTreeHelper.GetParent(potentialSubControl)
は、VisualTree の一部であるすべての要素に対して正常に機能します。どうやらフォーカスHyperlink
された ( によって返されるFocusManager.GetFocusedElement()
) は VisualTree の一部ではないため、 への無効な入力GetParent()
です。では、ハイパーリンクの親 (論理的な親または視覚的な親) を my 内で見つけるにはどうすればよい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;
}
[編集] 問題を解決するための 1 つの考えられるアイデア: Hyperlink は であるため、その継承コンテキストDependencyObject
にアクセスして、ツリーの上位にある他のものを見つけて、それらが であることをテストできます。しかし、Silverlight の継承コンテキストに関する情報を見つけるのに苦労しています。DependencyObjects
FrameworkElements