【问题标题】:use Winform Objects inside an Static Method在静态方法中使用 Winform 对象
【发布时间】:2015-02-24 22:42:36
【问题描述】:

我有一个问题可以忽略很长时间,但现在我必须解决它。
我有 3 个 GUI (Winform) 1 个主要 1 个设置和 1 个用于 Web 浏览器。
我需要在主窗体内调用 Webbrowser 窗体中的方法,因为该方法是静态方法。

但是如果我将它设置为静态,如果我尝试使用表单中的对象,它会给我一个错误。

    public partial class Form3 : Form
{
    public Form3()
    {
        InitializeComponent();
    }
    public static void WebLyrics(string url){
        webBrowser1.Navigate(url);
    }
}

【问题讨论】:

    标签: c# winforms methods static


    【解决方案1】:

    最简单的方法是:

    将静态Instance 属性添加到网络浏览器表单:

    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            Instance = this;
        }
    
        public static Form3 Instance { get; private set; }
    
        public void WebLyrics(string url)
        {
            webBrowser1.Navigate(url);
        }
    }
    

    并通过Instance属性以另一种形式调用WebLyrics方法:

    public partian class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Navigate() 
        {
            Form3.Instance.WebLyrics("www.stackoverflow.com");
        }
    }
    

    我假设你以某种方式创建了这两种表单......

    【讨论】:

      【解决方案2】:

      您应该考虑更改代码。为什么你的表单有一个静态方法?这没有任何意义。实现它的最简单方法是将 Webbrowser 表单的引用传递到主表单。或者您可以在主窗体中实例化 Webbrowser 窗体,然后显示它。

      但我建议您引入一种将 UI 与业务逻辑层分离的方法。考虑引入MVC/MVP模式,明确分离,表单之间不需要直接相互引用。

      【讨论】:

      • 我认为这是一个很好的答案,但是如果 OP 无法访问其他表单,但这将是一个完全的过度杀伤;-) 我猜他需要更多的经验来理解你 ;-]
      【解决方案3】:

      解决它的最简单(= 最少代码)方法可能是像其他人建议的那样对表单使用单例,或者更简单地使用内置表单注册表:

      var myForm3 = Application.OpenForms.OfType<Form3>.FirstOrDefault();
      

      我可能更喜欢使用单独的单例来保存表单,因为我会发现它更易于维护。这将是更好的关注点分离,因为表单不必创建为单例,并且可以以其他方式重用。真正的单例是你应用的 UI 布局。

      类似这样的:

      public class AppLayout
      {
          public static AppLayout Instance {
              get { ... }
          }
          public WebBrowserForm WebBrowser {get;private set;}
          public MainForm Main {get;private set;}
          public SettingsForm Settings {get;private set;}
      }
      

      把它想象成应用程序单例的类型化变体。

      【讨论】:

      • 虽然它也是一个不错的解决方案,但我认为 OP 还不能做到这一点;-] --- 哇,我不知道有这么酷的属性,如 OpenForms on Application 对象 - 我很高兴你发布了它 :-) 然而,创建和管理这些表单需要更多的编码。我自己可能不想实现它。
      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 2013-02-26
      • 1970-01-01
      • 2012-04-26
      • 1970-01-01
      • 2018-12-15
      • 2021-03-30
      • 2014-11-30
      相关资源
      最近更新 更多