0

CustomPopupPlacementポップアップが実際にレンダリングされるときに、渡された位置の配列のどれが使用されたかを把握しようとしています。これを検出するイベントはありますか?

2009年のこのmsdnスレッドはまさに私の問題のようですが、答えはないようです。

http://social.msdn.microsoft.com/Forums/da/wpf/thread/4c6d216a-0011-4202-aa7e-2fccef3cc355

マークされた回答は無効のようで、私の状況はスレッドの OP とまったく同じです。

4 つのパスを含むポップアップを作成し、DP を使用して 3 つのパスの可視性を切り替え、レンダリングされる正しい矢印パスを選択します。

したがって、CustomPopupPlacementCallbackデリゲートを介して 4 つの配置オプションを提供する場合、画面のエッジ ケースと並べ替えを処理した後、システムが最終的に選択した 4 つの位置を検出する方法はありますか。

4

2 に答える 2

2

ポップアップの配置を見つけるためのより良い方法。このメソッドには Child 要素が存在する必要がありますが、Popup 要素に付属する Grid を考慮すると問題ありません。

    UIElement container = VisualTreeHelper.GetParent(this) as UIElement;
    Point relativeLocation = this.Child.TranslatePoint(new Point(0, 0), container); //It HAS(!!!) to be this.Child

    if (relativeLocation.Y < 0) //or use X for left and right
    {
        Console.WriteLine("TOP PLACEMENT!");
    }
    else
    {
        Console.WriteLine("BOTTOM PLACEMENT!");
    }
于 2013-11-20T16:03:37.783 に答える
1

私は少しハッキーな解決策を持っています。カスタムポイントを派生TooTipクラスのフィールドとして保存し、OnOpenedメソッドをオーバーライドします。

protected override void OnOpened(RoutedEventArgs e)
{
    base.OnOpened(e);
    var p = this.TranslatePoint(new Point(0, 0), this.PlacementTarget);
    var diff1 = this.first - p;
    var diff2 = this.second - p;

    if (Math.Abs(Math.Min(diff1.Length, diff2.Length) - diff1.Length) < 0.01)
    {
        // First Point
    }
    else
    {
        // Second Point
    }
}

より良い解決策は大歓迎です

于 2013-03-13T16:22:49.237 に答える