我的主窗口产生了一个子窗口,它位于顶部,看起来像是主要的一部分。我想将子窗口与主窗口同步,但我不确定如何。
我的主窗口有我自己的标题栏,事件MouseLeftButtonDown调用此函数:
public void DragWindow(object sender, MouseButtonEventArgs args)
{
DragMove();
UpdateChildWindowPosition();
}
这导致在主窗口上执行的DragMove()在拖动标题栏时单独移动主窗口。直到我释放鼠标时才执行UpdateChildWindowPosition(),在鼠标中它读取一些元素坐标并设置子窗口位置 - 您会看到子窗口捕捉到不需要的位置。
如何让子窗口与主窗口同步移动?
答案 0 :(得分:5)
啊哈哈!
我的主窗口有一个事件LocationChanged,它与我的UpdateChildWindowPosition()绑定。 LocationChange在(duh)位置发生变化时触发,因此当我在上面发布的DragWindow中执行DragMove()时移动窗口时它会持续触发。
答案 1 :(得分:4)
您可以使用窗口的Left和Top属性放置辅助窗口。以下是一段代码:
在MainWindow代码中:
mDebugWindow.Left = this.Left + this.ActualWidth;
mDebugWindow.Top = this.Top;
在这种情况下,mDebugWindow是我的子窗口。此代码告诉它位于主窗口的右侧,窗口的顶部对齐。
希望这有帮助。
答案 2 :(得分:0)
您可以为“子”窗体公开DragMove()方法吗?然后从父母那里调用它?
public void DragWindow(object sender, MouseButtonEventArgs args)
{
DragMove();
UpdatePosition();
childForm.DragMove();
childForm.UpdatePosition();
}
或者如果您只是使用鼠标位置来确定移动表单的位置,请在当前的DragMove()方法中执行相同的计算并更改子表单的Form.Location属性吗?
答案 3 :(得分:0)
这是我做的:
我首先将Parent的实例设置为子窗口的所有者,(通过在MainWindow类public static MainWindow instance;
中设置实例然后instance = this;
来创建实例):
public ChildWindow()
{
Owner = MainWindow.instance;
InitializeComponent();
}
然后我在Parent Class中添加一个事件处理程序,以便在Parent移动时触发:
public MainWindow()
{
InitializeComponent();
LocationChanged += new EventHandler(Window_LocationChanged);
}
现在我遍历MainWindow所有的窗口来重置边距:
private void Window_LocationChanged(object sender, EventArgs e)
{
foreach (Window win in this.OwnedWindows)
{
win.Top = this.Top + ((this.ActualHeight - win.ActualHeight) / 2);
win.Left = this.Left + ((this.ActualWidth - win.ActualWidth) / 2);
}
}