【问题标题】:C# winforms event in Main method for any new form shown显示的任何新表单的 Main 方法中的 C# winforms 事件
【发布时间】:2013-07-31 18:43:25
【问题描述】:

我在同一个解决方案中有两个 Windows 窗体应用程序项目(一个测试和一个产品)和一个 dll 项目。这两个 winforms 应用程序项目只有一个类/函数 Program.Main()、我要询问的图标和 app.config 文件。它们都引用了包含其他所有内容(包括表单)的相同 dll。
我想要的是能够在每次显示应用程序中的新表单时设置图标(Form.Icon)和文本(Form.Text)。这样做的目的是为测试和产品提供不同的窗口标题和图标(以及不同的发布位置设置)。我怎样才能做到这一点?我尝试使用属性>应用程序>资源>图标和清单设置图标,但它不起作用。我会很高兴得到一个不同的图标,但文字会是一个很大的优势。 Program.Main() 方法中是否有要订阅的事件,在 Application.Run(new Form()) 之前,我可以设置图标和文本属性作为显示的表单,或任何其他解决方案? 编辑:我希望有这样的东西,因为有很多形式:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        SomeClass.NewWinFormShown += NewWinFormShown;
        Application.Run(new FrmTrackingList());
    }

    private static void NewWinFormShown(object sender, NewWinFormShownEventArgs e)
    {
        e.NewWinFormShown.Icon = ThisAppsIcon;//from resources
        e.NewWinFormShown.Text += " (TEST)";
    }

【问题讨论】:

  • 您能否对主 DLL 进行任何更改?您可以在构造函数中传入图标和窗口文本并从 DLL 中设置它。然后根据实例化它的程序传入不同的值。
  • 我可以对 DLL 进行更改,但我正在寻找更通用的解决方案,因为我有许多由第一个表单生成的表单。我添加了一个我希望的示例..
  • 你可以用windows钩子做这种事情。然而,它不能替代适当的 .NET 技术。为这些表单提供另一个基类。

标签: c# winforms main


【解决方案1】:

您可以为您在应用程序中使用的所有表单创建一个BaseForm,这并不难

public class AppForm : Form
{
    public AppForm()
    {
        InitializeComponent();
        This.Icon = MyAppSettings.AppIcon; <--read here
        this.Text  = "App Text"
    }
}

编辑: 在dll中访问图标,只需在dll中创建一个静态类并使用它

//In dll project
public static class MyAppSettings
{
     public Icon AppIcon {get;set;}
}

//In Exe project
static void Main()
{
    MyAppSettings.AppIcon = Resources.Icon;  <--set here
    //Rest of starting App Code goes here
}

然后让你的所有表单都派生自AppForm。这应该可以解决您的问题。

【讨论】:

  • 图标是项目中引用 DLL 的资源。 DLL 如何获取两个不同应用程序的图标?
【解决方案2】:

从 app.config 中的字段获取值。

使用 slowcheetah 为不同的构建设置不同的 app.config。

【讨论】:

    【解决方案3】:

    我不明白为什么不能在每个Program.Main 中设置图标和文本。保存表格,然后调整它。而不是

    Application.Run(new Form());
    

    Form myForm = new Form();
    myForm.Icon = theFancyIcon; // from resources, or any other way you want to get it
    myForm.Text = myTitleBarString;
    Application.Run(myForm);
    

    只要让每个版本的代码不同,因为你已经有不同的 Program.Main 文件,这应该很容易。

    【讨论】:

    • 我有很多由启动表单生成的表单,并且希望所有表单都相同。我添加了一个我希望的示例。
    • @zSwizz 同样的想法也适用。如果你的启动表单正在生成其他表单,它在生成的时候可以根据自己的设置子表单的图标和文本。除非您添加表单的地方有很多不同的代码点,在这种情况下,我会考虑重构您的代码以使其只有一个主表单加载其他表单的点(即包装函数)。
    猜你喜欢
    • 2020-06-19
    • 2011-01-11
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2014-03-06
    相关资源
    最近更新 更多