0

設定:ハイパーリンク を含むRichTextBoxとUI の別の場所があります。ボタンをクリックして開いた後、UI の別の場所をクリックすると、閉じるように実装され、キーボードフォーカスがまだ所有されているかどうかを確認して、意図したとおりに折りたたんだ後に再びフォーカスを設定できるようにします。DropDownButtonDropDownDropDownToggleButtonDropDown

問題: 内部をクリックすると、フォーカスの所有権を確認する方法が原因で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 の継承コンテキストに関する情報を見つけるのに苦労しています。DependencyObjectsFrameworkElements

4

0 に答える 0