【问题标题】:Move two WPF windows at once?一次移动两个 WPF 窗口?
【发布时间】:2009-01-14 23:19:57
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    啊哈!

    我的主窗口有一个事件 LocationChanged,我已将它绑定到我的 UpdateChildWindowPosition()。 LocationChange 在(duh)位置更改时触发,因此当我在上面发布的 DragWindow 中执行 DragMove() 时移动窗口时,它会不断触发。

    【讨论】:

      【解决方案2】:

      您可以使用窗口的 Left 和 Top 属性来放置辅助窗口。下面是一个粗略的代码示例:

      在 MainWindow 代码中:

              mDebugWindow.Left = this.Left + this.ActualWidth;
              mDebugWindow.Top = this.Top;
      

      在这种情况下,mDebugWindow 是我的子窗口。此代码告诉它位于主窗口的右侧,窗口顶部对齐。

      希望这会有所帮助。

      【讨论】:

      • 谢谢,这与我的 UpdateChildWindowPosition() 中的代码类似。它可以工作,但是当我拖动主窗口时它不能实时工作。它仅在我释放拖动时才会执行,导致第二个窗口在我拖动并在释放时卡入到位时静止。
      【解决方案3】:

      这是我所做的:

      我首先将 Parent 的 Instance 设置为 Child 窗口的所有者,(通过在 MainWindow 类public static MainWindow instance; 然后instance = this; 中设置它来创建一个实例):

      public ChildWindow()
      {
          Owner = MainWindow.instance;
          InitializeComponent();
      }
      

      然后我在父类中添加一个事件处理程序以在父类移动时触发:

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

      【讨论】:

        【解决方案4】:

        你能为“子”表单公开一个 DragMove() 方法吗?那么就直接从父级调用它?

        public void DragWindow(object sender, MouseButtonEventArgs args)
        {
             DragMove();
             UpdatePosition();
        
             childForm.DragMove();
             childForm.UpdatePosition();
        }
        

        或者,如果您只是使用鼠标位置来确定将表单移动到哪里,在您当前的 DragMove() 方法中执行相同的计算并更改您的子表单的 Form.Location 属性?

        【讨论】:

        • 对不起,我没说清楚。我已经更新了我的问题。 DragMove() 是一个内置的 WPF 函数调用,用于移动我正在拖动的窗口。它一直执行,直到我释放拖动,此时 UpdatePosition 被调用并将子窗口捕捉到一个位置。
        猜你喜欢
        • 1970-01-01
        • 2018-05-02
        • 2011-10-27
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多