一次移动两个WPF窗口?

时间:2009-01-14 23:19:57

标签: c# .net wpf

我的主窗口产生了一个子窗口,它位于顶部,看起来像是主要的一部分。我想将子窗口与主窗口同步,但我不确定如何。

我的主窗口有我自己的标题栏,事件MouseLeftButtonDown调用此函数:

public void DragWindow(object sender, MouseButtonEventArgs args)
{
     DragMove();
     UpdateChildWindowPosition();
}

这导致在主窗口上执行的DragMove()在拖动标题栏时单独移动主窗口。直到我释放鼠标时才执行UpdateChildWindowPosition(),在鼠标中它读取一些元素坐标并设置子窗口位置 - 您会看到子窗口捕捉到不需要的位置。

如何让子窗口与主窗口同步移动?

4 个答案:

答案 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);
    }
}