【问题标题】:Create Windows Form as Class Library将 Windows 窗体创建为类库
【发布时间】:2015-11-19 13:20:31
【问题描述】:

我正在尝试制作一个 windows form 以便在多个项目中重复使用。所以我认为这将是一个类库。我想要做的是调用WindowsForm.Show() 作为静态调用。我试图创建一个类库,但我无法获得图标的资源。然后我创建了一个WinForms 项目,但它希望在 program.cs 中有一个“新”。我不想打电话

WindowsForm form = new WindowsForm() 
form.show()

如何创建可重复使用的静态表单?我希望我是清楚的。

【问题讨论】:

  • 这是可行的。包含Form/UserControl/whatever 的 dll。您是真正的问题“无法访问图标的资源”?将其公开为另一个 static 属性以便稍后设置。或者作为参数传递给静态方法,该方法将创建实例并显示表单。
  • 这一切都是可行的,类工厂是一个明显的替代方案,但忽略表单实际上不是“可重用”的事实迟早会变得非常糟糕。一旦它被关闭,它就不再可用,并且无论如何尝试使用它都会产生 ObjectDisposedException。这可以被破解,但表单对象非常昂贵。您实际上是在创建内存泄漏。只是不要。
  • (new WindowsForm()).Show() 到底有什么问题?

标签: c# winforms .net-assembly


【解决方案1】:

要添加工厂方法,您可以这样做:

public static MyForm ShowNew()
{
    MyForm form = new MyForm();
    return form;
}

关于资源,这取决于您使用图标的目的。如果图标始终相同且始终相同,则将其添加到您的库属性/资源中(如果您没有看到它,请转到您的库项目属性,在选项卡 Resources 上,并单击添加)。否则,将参数添加到您的工厂方法(以及表单构造函数)并在调用表单时传递它:

public static MyForm ShowNew(Icon ico)
{
    MyForm form = new MyForm(ico);
    return form;
}

实例化时

MyForm.ShowNew(Properties.Resources.my_icon);

【讨论】:

    【解决方案2】:

    另一种方法是像往常一样实现您的表单,将其包装在类似 Singleton 的类中:

    public static class WindowsFormSingleton {
    
        // A static instance of your form
        private static WindowsForm _form;
    
        // A singleton property to interact with the form.
        public static WindowsForm Instance
        {
            get
            {
                if(_form == null) {
                    this._form = new WindowsForm();
                }
                else if(_form.IsDisposed) {
                    this._form = new WindowsForm();
                }
    
                return this._form;
            }
        }
    }
    

    ... 并使用如下的单例实例:

    WindowsFormSingleton.Instance.Show();
    

    注意:正如 taffer 在 cmets 中所述,using a Factory method 始终创建一个新实例将是解决此问题的更好方法。

    【讨论】:

    • 这是个坏主意。一旦表单关闭,它将无法使用。如果静态工厂方法总是创建一个新实例会更好。
    • 嗯。如果唯一的问题是处置,那么在创建新实例时检查IsDisposed 属性会拯救我们吗?
    • 或者,我会发布一个静态的Show 方法,它总是可以创建或重用一个表单。类似于MessageBox
    猜你喜欢
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多