C#CenterToScreen()Winforms Designer屏幕位置

C#CenterToScreen()Winforms Designer屏幕位置,c#,winforms,windows-forms-designer,C#,Winforms,Windows Forms Designer,我有一个项目,其中的表单继承了基础表单(称为frmBase)的属性。我遇到了一个让我非常困惑的问题: 我希望程序集中在用户屏幕上,所以我添加了 此.CenterToScreen() 到frmBase_Load()。这在我运行应用程序时非常有效,但是,当我尝试设计从frmBase继承的任何表单时,它们都会移动到设计器屏幕的右下角,我必须使用滚动条才能看到它们 如果我移动 此.CenterToScreen() 对于frmBase()代码,应用程序在运行时默认位于屏幕的左上角,但设计器会为我正确显示表

我有一个项目,其中的表单继承了基础表单(称为frmBase)的属性。我遇到了一个让我非常困惑的问题:

我希望程序集中在用户屏幕上,所以我添加了

此.CenterToScreen()

到frmBase_Load()。这在我运行应用程序时非常有效,但是,当我尝试设计从frmBase继承的任何表单时,它们都会移动到设计器屏幕的右下角,我必须使用滚动条才能看到它们

如果我移动

此.CenterToScreen()

对于frmBase()代码,应用程序在运行时默认位于屏幕的左上角,但设计器会为我正确显示表单。知道发生了什么吗?我搜索了一下,但似乎找不到类似的问题,尽管我知道我不可能是第一个遇到这种情况的人

如所示,Visual Studio表单设计器正在实例化基类,因此构造函数中的代码及其加载事件也会运行。看看这个伟大的答案。使用该属性可以防止执行代码或进行区分。以下代码示例演示了它的用法:

基本形式 当处于设计模式时,基窗体将背景色设置为红色,当不处于设计模式时,将背景色设置为绿色

// Form1 inherits from this class
public class MyBase : Form
{
    public MyBase()
    {
        // hookup load event
        this.Load += (s, e) =>
        {
            // check in which state we are
            if (this.DesignMode)
            {
                this.BackColor = Color.Red;
            }
            else
            {
                this.BackColor = Color.Green;
            }
        };
    }
}
继承基础窗体的窗体1 代码中没有魔法,但是请注意使用了
MyBase
而不是
Form

// we inherit from MyBase!
public partial class Form1 : MyBase
{
    public Form1()
    {
        InitializeComponent();
    }
}
导致以下结果:


负载事件也会在设计时触发。如果(!DesignMode),请使用
以防止此类代码妨碍。在designer中加载表单时,设计器将创建表单基类的实例,并使用该实例承载表单的控件。由于表单的基类在构造函数中运行的InitializeComponents中附加了事件处理程序,因此在设计器中打开子表单时,基本表单加载事件处理程序中的代码将运行。正如@HansPassant所提到的,防止在设计模式下执行基本表单代码的解决方案是添加
if(!DesignMode)
以加载基本表单的事件处理程序。您可能会发现或有帮助。为什么希望中心显示在屏幕上?运行时是否希望表单位于中心位置?另外-
DesignMode
并不总是有效。OP应该知道的一件非常重要的事情是当前表单的
Load
事件没有在设计时触发。它是基本形式
Load
事件,可以并且将在设计时触发+1你可能会发现我的两篇链接文章很有帮助。他们对设计师的工作原理有很好的解释。他们还分享了一些有趣的设计器代码示例。@RezaAghaei谢谢,我对答案进行了一些编辑,以使其更加清晰,并提供了指向您答案的链接。