繁体   English   中英

在C#中移动Form2时移动Form1

[英]Move Form1 when I move Form2 in C#

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

Form2.ShowDialog();

Form2 StartPosition配置为centerParent

我需要将Form2位置固定在Form1的中心,以便在移动Form2Form1也可以更改其位置。 我尝试了许多解决方案,但均未成功。

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

该代码不执行任何错误检查,仅用于演示代码。

请注意,这通常是非常不受欢迎的UI功能。 对话框很烦人,因为它们禁用了应用程序中其余的窗口。 这阻止用户激活窗口以查看其内容。 用户所能做的就是将对话框移开。 您有意阻止此操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM