2

これは以前に尋ねられたことは知っていますが(wpfのウィンドウ内の要素の絶対位置を取得)、まだ適切に実装できていません。親ウィンドウのコントロールに対して子ウィンドウを開かせようとしています。これまでのところ、私はこれを持っています。

messageWindow = new Message(true);
Point relativePoint = btn1.TransformToAncestor(this).Transform(new Point(0, 0));
messageWindow.Left = relativePoint.X;
messageWindow.Top = relativePoint.Y;
messageWindow.Show();

これは子ウィンドウ()の位置に影響しますが、親messageWindowのコントロールの上/横に配置されていないようです。btn1私が抱えているもう1つの問題は、親ウィンドウを移動した場合、元のウィンドウを閉じたこのメソッドを思い出してmessageWindow、ウィンドウの新しいインスタンスが古い位置に表示されることです(btn1新しい位置にある場合でも)。私はこれが奇妙だと思い、誰かが私がこれを修正するのを手伝ってくれるかどうか疑問に思いました。

アップデート

画面全体ではなく、ウィンドウ内のコントロールの場所を基準にして設定しているだけだと説明してくれたCharlehに感謝します。したがって、ここで、画面上の親ウィンドウの位置を取得し、それをXYに追加することが問題になります。どうすればこれを入手できますか?このコードを試してみたところ(正直に言うと、よくわかりませんが)、バスはまだあまり厳密に追跡されていないようです。画面上のウィンドウの場所を取得する良い方法は何ですか?;

messageWindow= new Message(true);
Point relativePoint = btn1.TransformToAncestor(this).Transform(new Point(0, 0));
PresentationSource ScreenPos = PresentationSource.FromVisual(this);

messageWindow.Left = relativePoint.X + (96.0 * ScreenPos.CompositionTarget.TransformToDevice.M11);
messageWindow.Top = relativePoint.Y + (96.0 * ScreenPos.CompositionTarget.TransformToDevice.M22);
messageWindow.Show();
4

1 に答える 1

3

relativePoint画面ではなく、に対するコントロールの位置です。(子ウィンドウ)のとポイントを設定する場合、ポイントは親ウィンドウWindowではなく、画面を基準にしています。LeftRightmessageWindow

正しい位置を取得するには、親ウィンドウの位置を見つけてから、計算を行って、目的の場所の場所を示すウィンドウではなく、画面に対してコントロールが配置されている場所を見つける必要があります。子ウィンドウを配置します。

于 2012-06-27T14:02:50.723 に答える