【发布时间】:2012-07-04 10:37:40
【问题描述】:
好的,由于缺乏回复,所以完全重写了问题。我想要一个可拖动的窗口,但在拖动它时,更改边距以延伸到窗口的旧位置。 IE。窗口向右移动 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
}
目前整个窗口(将窗口背景设置为黄色以便我可以看到边距)正在移动,因为我希望边距的左上角保持在原位。我还注意到,我单击以拖动窗口的区域(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 突出到左侧并指向父窗口(如果有更好/更酷/更优雅的方式这样做,我全神贯注)。
所以效果很好,但现在我希望指针是动态的。例如,如果子窗口被拖动,则指针必须相对于父窗口的位置进行缩放。 IE。它必须看起来好像两个窗口通过线连接。现在我的计划是记录子窗口打开的点(因为它相对于父窗口打开,初始化时是正确的),然后使用这个和新位置点之间的差异(拖动后)找到新点该行应该去。我的代码可能比以往任何时候都说得更好......
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 坐标重置为新值。正如我所说,所有这些值都是通过将打开窗口坐标与当前坐标进行比较来计算的。
我的问题是,这是不对的。看到有人能够解决这个问题会非常令人印象深刻。
【问题讨论】:
-
在您的 Update2 中,“它仍然不是很好”是什么意思?您的子窗口应该始终位于父窗口的左侧?
-
我已经重写了我的问题,现在更清楚了吗?
-
如果您的子窗口指向父窗口,它必须向用户显示一些有用的信息。您不应该允许用户移动子窗口。
-
它必须能够移动,因为用户可能还希望看到孩子可能掩盖的主窗口的不同部分。
-
如果:1) 子窗口正好位于箭头应显示的信息上? 2)子窗口在该信息的右侧?
标签: c# wpf math coordinates parent-child