好的,由于缺乏回复,所以完全重写了问题。我想要一个可拖动的窗口,但在拖动时,更改边距以延伸到窗口的旧位置。即窗口向右移动 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>
请注意边框上的 40 左侧Margin
使窗口比它看起来更大,因此Polygon
突出到左侧并指向父窗口(如果有更好/更酷/更优雅的方法,我会全力以赴) .
所以这很好,但现在我希望指针是动态的。例如,如果子窗口被拖动,则指针必须相对于父窗口的位置进行缩放。即它必须看起来好像两个窗口通过线路连接。现在我的计划是记录子窗口打开的点(因为它相对于父窗口打开,初始化时是正确的),然后使用这个和新位置点之间的差异(拖动后)找到新点该行应该去。我的代码可能比我以往任何时候都说得更好......
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
坐标重置为新值。正如我所说,所有这些值都是通过将打开窗口坐标与当前坐标进行比较来计算的。
我的问题是,这是不对的。看到有人能够解决这个问题会非常令人印象深刻。