返信がないため、質問を完全に書き直してください。ドラッグ可能なウィンドウが必要ですが、ドラッグしているときに、ウィンドウの古い位置まで拡張するようにマージンを変更します。つまり、ウィンドウは右Xに移動し、マージンを左Xに拡張します。これで、ウィンドウのエッジが何らかの理由で切り取られているなど、いくつかの障害が発生しました。これが私のコードです。何か見つけられるかどうか教えてください!
private void Window_LocationChanged(object sender, EventArgs e)
{
double TmpLeft = Math.Abs(this.Left - WinLeft);
double TmpTop = Math.Abs(this.Top - WinTop);
if (this.IsLoaded)
{//depending on whether the window is moved left, right
if (this.Left > WinLeft)
{//depending on whether the window is moved up, down
if (this.Top > WinTop)
bdr.Margin = new Thickness(TmpLeft, TmpTop, 0, 0);
else
bdr.Margin = new Thickness(TmpLeft, 0, 0, TmpTop);
}
else
{
if (this.Top > WinTop)
bdr.Margin = new Thickness(0, TmpTop, TmpLeft+ 40, 0);
else
bdr.Margin = new Thickness(0, 0, TmpLeft, TmpTop);
}
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WinLeft = this.Left;
WinTop = this.Top;
bdr.Height = this.ActualHeight;//I set these because they are auto
bdr.Width = this.ActualWidth; //before the window opens
}
現在、ウィンドウ全体(マージンが見えるようにウィンドウの背景を黄色に設定)が移動していますが、マージンの左上隅をそのままにしておきます。また、ウィンドウをドラッグするためにクリックした領域(a border
)も移動する傾向があるため、ウィンドウを移動してもクリックの下に表示されなくなりました。それが明確であることを願って、さらに質問があればコメントしてください。
古い-私がやろうとしていることを理解するためだけに読んでください
そのため、子ウィンドウから親ウィンドウの特定の場所にポインタ/行が表示されるポップアップウィンドウを持つアプリケーションを作成しようとしています。私はそのようにこれを達成しました。
<Border Name="brdr" Margin="40,0,0,0" >
//Content
</Border>
<Line
Name="Pointer"
X1="0"
X2="40"
Y1="55"
Y2="50"
StrokeThickness="2"
Stroke="Black"
></Line>
Margin
ウィンドウが表示よりも大きくなるように境界線に残っている40に注意してください。これにより、Polygon
スティックが左に突き出て、親ウィンドウを指します(これを行うためのより良い/より涼しい/よりエレガントな方法がある場合、私はすべての耳です) 。
これで問題なく動作しましたが、ポインタを動的にする必要があります。のように、子ウィンドウがドラッグされた場合、ポインタは親ウィンドウの位置に対して相対的に拡大縮小する必要があります。つまり、2つのウィンドウが線で接続されているように見える必要があります。今、私の計画は、子ウィンドウが開くポイントを記録し(親ウィンドウに対して開くため、初期化すると正しい)、これと新しい場所のポイント(ドラッグ後)の差を使用して新しいポイントを見つけることでした。その行が行くべきです。私のコードはおそらく私がこれまでにできたよりも良いと言っています...
private void Window_LocationChanged(object sender, EventArgs e)
{
if (this.IsLoaded)
{
brdr.Margin = new Thickness(Math.Abs(this.Left - WinLeft) + 40, Math.Abs(this.Top - WinTop), 0, 0);
Pointer.X1 = Math.Abs(this.Left - WinLeft);
Pointer.Y1 = Math.Abs(this.Top - WinTop) + 55;
Pointer.X2 = Math.Abs(this.Left - WinLeft) + 40;
Pointer.Y2 = Math.Abs(this.Top - WinTop) + 50;
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WinLeft = this.Left;
WinTop = this.Top;
}
ご覧のとおり、ウィンドウのマージンを古い位置に拡張するように設定する必要があります。Line
次に、座標を新しい値にリセットします。これらの値はすべて、私が言ったように、開いているウィンドウの座標を現在の座標と比較することによって計算されます。
私の問題は、これは正しくないということです。誰かがこれを理解できるのを見て非常に感銘を受けるでしょう。