我正在使用C#应用程序。我想从另一种形式更改窗体的面板容器的可见性,例如设置首选项。
我遇到的问题是:当我从另一个表单中调用包含容器可见性方法的方法时,它不会影响任何事物。 请帮帮我。
这是包含方法的主表格:
public partial class MainWindow : Form
{
public MainWindow()
{
InitializeComponent();
}
public void langPref_Amharic()
{
main_amharic_pannel.Visible = true;
main_english_pannel.Visible = false;
home_amharic_title.Visible = true;
home_eng_title.Visible = false;
}
public void langPref_English()
{
main_amharic_pannel.Visible = false;
main_english_pannel.Visible = true;
home_amharic_title.Visible = false;
home_eng_title.Visible = true;
}
此代码来自另一种形式,以调用方法并应用属性:
public partial class frm_Settings : Form
{
MainWindow main = new MainWindow();
public frm_Settings()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (opt_amharic.Checked == true)
{
main.langPref_Amharic();
}
if (opt_english.Checked == true)
{
main.langPref_English();
}
}
}
}
答案 0 :(得分:1)
您需要修改现有表单,而不是新表单。最简单的方法是在设置表单的构造函数中传递对现有表单的引用。
public partial class MainWindow : Form
{
public MainWindow()
{
InitializeComponent();
}
public void langPref_Amharic()
{
main_amharic_pannel.Visible = true;
main_english_pannel.Visible = false;
home_amharic_title.Visible = true;
home_eng_title.Visible = false;
}
public void langPref_English()
{
main_amharic_pannel.Visible = false;
main_english_pannel.Visible = true;
home_amharic_title.Visible = false;
home_eng_title.Visible = true;
}
public void OpenSettingsForm()
{
frm_Settings settings = new frm_Settings(this);
settings.Show();
}
}
然后在您的设置表单中,对构造函数进行简单修改以接受引用:
public partial class frm_Settings : Form
{
MainWindow main;
public frm_Settings(MainWindow mainWin)
{
InitializeComponent();
main = mainWin;
}
private void button1_Click(object sender, EventArgs e)
{
if (opt_amharic.Checked == true)
{
main.langPref_Amharic();
}
if (opt_english.Checked == true)
{
main.langPref_English();
}
}
}
}
这里发生的是您正在创建主窗口表单的新实例。这意味着它听起来像是一个 new 实例。您确实想要引用现有实例,因此需要将引用传递给新表单。
如果您的可见性问题不起作用,您可能需要修改设置表单以调用调度程序上的函数,如下所示:
请注意,这是WPF特定的
if (opt_amharic.Checked == true)
{
Dispatcher.Invoke(() => { main.langPref_Amharic(); });
}
if (opt_english.Checked == true)
{
Dispatcher.Invoke(() => { main.langPref_English(); });
}
这个适用于winforms
if (opt_amharic.Checked == true)
{
main.Invoke((MethodInvoker) delegate { main.langPref_Amharic(); });
}
if (opt_english.Checked == true)
{
main.Invoke((MethodInvoker) delegate { main.langPref_English(); });
}
验证UI更新是否发生在UI线程上,这是UI应用程序所必需的。