通过另一种形式的方法改变控制的属性不会影响?

时间:2015-05-19 13:23:16

标签: c#

我正在使用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();
            }
        }
    }
}

1 个答案:

答案 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应用程序所必需的。