【问题标题】:WinForms Designer should run method from CodeBehind?WinForms Designer 应该从 CodeBehind 运行方法吗?
【发布时间】:2018-06-03 00:26:29
【问题描述】:

我有一个小的 WinForms 应用程序,在主窗口的中心只有一个按钮。那就是按钮文本是Button 1。 在调用 InitializeComponent 之后,代码中的构造函数 (F7) 将按钮文本更改为 Hello World

运行时显示“Hello World”,但在设计时设计器显示“按钮 1”。 WinForms 中运行自定义 UI 代码的正确方法是什么。如果我手动将该代码放入设计器文件中,那么下次保存设计器时我的更改将被覆盖。

这是我的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.button1.Text = "Hello World";
    }
}

【问题讨论】:

  • 如果您愿意,可以从属性窗口更改按钮文本,使其显示与运行时间相同。
  • 您也可以进入表单设计器(Form1.designer.cs)手动编辑您的控件属性。
  • Form1 的constr 只会在您启动应用程序后执行,这就是意图。但是,如果您在初始化所有对象和内容后立即设置Text,您已经可以在设计器类中设置Text。顺便说一下,没有后面的代码,这个类和设计器类是partial类,所以两者一起形成一个类(Form1),但是@987654328的设计东西@ 被外包到设计器类中以简化代码以便更好地理解和更清晰的概述。
  • @SeckinCelik:当然,真正的问题要复杂一些(使用特殊方法通过枚举而不是资源设置功能区按钮的图标)。
  • @L.Guthardt:它们是部分的,但似乎设计师在另一个上下文中运行设计文件。因为如果您从设计器文件初始化方法中调用自定义方法,那么设计器将显示一条错误消息:“找不到方法'System.Windows.Forms.Form.xxx'。”

标签: c# .net winforms windows-forms-designer


【解决方案1】:

标题说:

WinForms Designer 应该从 CodeBehind 运行方法吗?

Designer 很棘手,因为你设计新类型Form1 它实际上会创建一个基类Form 的实例,然后让你修改它,生成designer.cs 和资源给你。

为确保代码能够在设计器中运行,您必须将其移至基类。这可以通过制作自定义控件来实现:

public class MyForm: Form
{
    protected button1;

    public MyForm()
    {
        button1 = new Button { Text = "Hello World" }; // here
        Controls.Add(button1);
    }
}

现在,当您从它继承新表单时,所有这些表单都会有一个按钮。

public partial class Form1 : MyForm
{
    public Form1()
    {
        InitializeComponent();
    }
}

为了方便新用户使用UserControl。在编辑它时,后面的代码更改不会直接显示在设计器中。但是一旦你完成,编译它并将其添加到另一个表单 - 编辑另一个表单时,设计师将在那里运行你的代码。但是,每次更改用户控件背后的代码后,您都必须重新编译。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    • 2019-11-29
    • 1970-01-01
    相关资源
    最近更新 更多