我有一个问题,我可以忽略很长一段时间,但现在我必须解决它 我有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);
}
}
答案 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;}
}
将其视为应用程序单例的类型变体。