我在C#中移动Form2时移动Form1

时间:2013-02-10 09:34:13

标签: c# winforms

我有两种形式。正在Form2打开Form1,如下所示:

Form2.ShowDialog();
StartPosition的{​​{1}}配置为Form2

我需要在Form1的中心修复位置centerParent,这样当我移动Form2时,Form2也会更改其位置。我尝试了许多解决方案但没有成功。

2 个答案:

答案 0 :(得分:4)

在调用ShowDialog函数时,您必须包含父引用,但您还必须使用LocationChanged事件在之前记录初始位置差异

Form2 f2 = new Form2();
f2.StartPosition = FormStartPosition.CenterParent;
f2.ShowDialog(this);

然后在对话框中,你可以像这样连线:

Point parentOffset = Point.Empty;
bool wasShown = false;

public Form2() {
  InitializeComponent();
}

protected override void OnShown(EventArgs e) {
  parentOffset = new Point(this.Left - this.Owner.Left,
                           this.Top - this.Owner.Top);
  wasShown = true;
  base.OnShown(e);
}

protected override void OnLocationChanged(EventArgs e) {
  if (wasShown) {
    this.Owner.Location = new Point(this.Left - parentOffset.X, 
                                    this.Top - parentOffset.Y);
  }
  base.OnLocationChanged(e);
}

此代码不执行任何错误检查,仅显示演示代码。

答案 1 :(得分:2)

请注意,这通常是非常不受欢迎的用户界面功能。对话框很烦人,因为它们会禁用应用程序中的其余窗口。这会阻止用户激活窗口以查看其内容。用户可以做的就是将对话框移开。你有意阻止这种情况发生。

Anyhoo,很容易用LocationChanged事件实现。将此代码粘贴到对话框表单类中:

    private Point oldLocation = new Point(int.MaxValue, 0);

    protected override void OnLocationChanged(EventArgs e) {
        if (oldLocation.X != int.MaxValue && this.Owner != null) {
            this.Owner.Location = new Point(
                this.Owner.Left + this.Left - oldLocation.X,
                this.Owner.Top + this.Top - oldLocation.Y);
        }
        oldLocation = this.Location;
        base.OnLocationChanged(e);
    }