2017-06-23 5 views
1

WPFポップアップコントロールを使用しています。wpfのポップアップコントロールと画面のトップの距離を計算するには?

ポップアップコントロールの距離/高さまたはY座標を画面の上から計算する方法を知っておく必要があります。だから、それをどのように計算するのですか?

問題のスクリーンショットの添付画像をご覧ください。

Image for pop up with the issue

次のように私は2つの解決策を試してみました:

まずソリューションを------------------------- ------------------------------

Window w = Application.Current.Point 
relativePoint = popNonTopMostPopup.TransformToAncestor(w) 
          .Transform(new Point(0, 0)); 

問題:それはいつものように同じ座標を返します relativePoint.X = 3.0およびrelativePoint.Y = 25 .96
画像に表示されているように、地図アイコンの右側にポップアップが表示されます。別の地図アイコンをクリックすると、それに応じてポップアップ位置が変更されます。したがって、異なる地理座標を返す必要があります。

第2の解決策------------------------------------------- ---------

Point position = popNonTopMostPopup.PointToScreen(new Point(0d, 0d)), 
controlPosition = this.PointToScreen(new Point(0d, 0d)); 
position.X -= controlPosition.X; 
position.Y -= controlPosition.Y; 

問題:このソリューションalso..itと同じ問題が常にposition.X = 3.0とposition.Y = 49.0あるたびに同じ地理座標を返しています

+0

あなたが本当にあなたのアプリケーションの画面やトップのトップが必要です(それが最大化さていないとき)? –

+0

ありがとう@Felix D.はい画面の上部が必要です。 – pankaj

+0

'popNonTopMostPopup'は' UserControl'ですか、 'Popup'自体ですか? –

答えて

0

あなたはこれを使用することができます:

TransformToAncestorhereに示すように。

Point relativePointInWindow = yourPopup.TransformToAncestor(yourWindow) 
             .Transform(new Point(0, 0)); 

でもUserControlにあなたはそうしないと、あなたのメインウィンドウを取得するためにApplication.Current.MainWindowで行くことができ、親

popup.parent.parent  
popup => usercontrol => window 

にアクセスすることができます。

次に、上記のようにポップアップの位置を取得します。

必要に応じてSystem.Windows.SystemParameters.CaptionHeightを追加することができます。これは、この(未テスト)に似て見ることができる

public class MyMapArea : UserControl 
{ 
    public MyMapArea() 
    { 

    } 

    /// <summary> 
    /// Returns the Y position relative to ScreenTop in Pixels 
    /// </summary> 
    private int GetYPositionOfPopup() 
    { 
     Popup popup = this.popup; 

     Window window; 

     FrameworkElement element; 

     //Walk up the ui tree 
     while(1 == 1) 
     { 
      //Remember to check for nulls, etc... 
      element = this.parent; 
      if(element.GetType() == typeof(Window)) 
      { 
       //if you found the window set it to "window" 
       window = (window)element; 
       break; 
      } 
     } 

     Point relativePointInWindow = popup.TransformToAncestor(window) 
            .Transform(new Point(0, 0)); 

     return relativePointInWindow.Y // + System.Windows.SystemParameters.CaptionHeight; 
    } 
} 
+0

ポップアップコントロールとスクリーンの距離が必要です...ウィンドウの上部ではありません。私のポップアップコントロールはユーザーコントロールにあり、そのユーザーコントロールはdllにあるので、アプリケーションのウィンドウに直接アクセスすることはできません。他の解決策はありますか?ありがとう:) – pankaj

+0

@pankajあなたが必要なものかどうかを確認してください。 –

+0

Hii @Felix D.このようにあなたの提案したコードを使用しました。 ウィンドウw = Application.Current.MainWindow; ポイントrelativePoint = popNonTopMostPopup.TransformToAncestor(w) .Transform(新しいポイント(0、0)); double x = relativePoint.X; double y = relativePoint.Y; – pankaj

関連する問題