WinForm调用静态类Visibility方法后Form1用户控件不显示如何解决
问题根因
Visibility静态类中定义的static Form1 f = new Form1()是独立创建的全新窗体实例,和你当前正在运行、可见的Form1窗口不是同一个对象。你修改的是从未显示到前台的后台实例控件属性,自然不会在可见窗口上生效。
修复方案
方案1:调用时传入当前窗体实例(推荐)
修改Visibility类,删除内部的静态Form1字段,给所有可见性控制方法增加Form1类型的入参:
public static class Visibility { public static void HospodaVisible(Form1 targetForm) { targetForm.hospoda1.Visible = true; targetForm.arena1.Visible = false; targetForm.podzemi1.Visible = false; } public static void ArenaVisible(Form1 targetForm) { targetForm.hospoda1.Visible = false; targetForm.arena1.Visible = true; targetForm.podzemi1.Visible = false; } public static void PodzemiVisible(Form1 targetForm) { targetForm.hospoda1.Visible = false; targetForm.arena1.Visible = false; targetForm.podzemi1.Visible = true; } }
修改Form1的按钮点击事件,调用方法时传入当前窗体实例this:
private void button1_Click(object sender, EventArgs e) { Visibility.HospodaVisible(this); }
方案2:给静态类绑定当前运行的窗体实例
修改Visibility类,新增静态属性存储当前运行的窗体实例:
public static class Visibility { // 存储当前正在运行的Form1实例 public static Form1 RunningForm { get; set; } public static void HospodaVisible() { if (RunningForm == null) return; RunningForm.hospoda1.Visible = true; RunningForm.arena1.Visible = false; RunningForm.podzemi1.Visible = false; } // 其余两个方法同理修改为使用RunningForm属性 }
在Form1的加载事件中给静态类的实例属性赋值:
private void Form1_Load(object sender, EventArgs e) { Visibility.RunningForm = this; hospoda1.Visible = false; arena1.Visible = false; podzemi1.Visible = false; }
注意事项
需要将Form1中hospoda1、arena1、podzemi1三个控件的访问修饰符修改为Internal或Public,否则Visibility类无法访问这些控件属性:你可以在窗体设计器中选中对应控件,在属性面板找到Modifiers选项,修改为Internal即可。
内容的提问来源于stack exchange,提问作者Šimon Novák
相关产品推荐
相关产品推荐

