在静态方法中使用Winform对象

时间:2014-12-28 14:03:28

标签: c# winforms methods static

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

最简单的方法是:

向webbrowser表单添加静态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);
    }
}

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

public partian class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Navigate() 
    {
        Form3.Instance.WebLyrics("www.stackoverflow.com");
    }
}

我假设你以某种方式在某处创建了两种形式......

答案 2 :(得分:1)

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

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;}
}

将其视为应用程序单例的类型变体。