WPF + Windows窗体,从第一个窗体打开第二个窗体作为MainWindow的子窗口

时间:2016-08-25 15:28:53

标签: c# wpf forms

可能我不会在标题中说清楚,如有必要就改变它。现在我逐步解释:

我在WPF中完成了一个程序(导致图形)。 MainWindow用一个按钮打开第一个Form,Form1做一些东西,改变MainWindow的UI,当它完成时应该打开一个Form2,它应该做一些改变MainWindow UI的东西,但我可以&#39 ; t通过Form1打开Form2。

这里有一些代码:

MainWindow.xaml.cs

internal static MainWindow main; //It allows me to put the Form1 in the same context in order to change the UI
private void start_button_Click(object sender, RoutedEventArgs e)
{
     Form1 frm = new Form1(this);
     frm.Show();
}

Form1.cs的

//function that allow me to communicate with the MainWindow
private MainWindow main1 = null;

public Form1(MainWindow callingForm)
{
     main1 = callingForm as MainWindow;
     InitializeComponent();
}

//Load function
private void Form1_Load(object sender, EventArgs e)
{
     //do some stuff changing MainWindow UI
     Form2 frm = new Form2(main1); //no compilation error
     frm.Show();
}

现在,Form2无法打开。我也尝试用Form1调用MainWindow中的void,但没有。我该怎么办?注意:还需要使用Form2更改主窗口的UI,我需要仅在Form1计算结束时打开Form2。

3 个答案:

答案 0 :(得分:0)

    public Form1(MainWindow callingForm)
    {
        main1 = callingForm as MainWindow;
        InitializeComponent();
        this.Load += Form1_Load;
    }

答案 1 :(得分:0)

如果您尝试从MainWindow打开一个窗口,我建议您使用events来实例化窗口。

从结构的角度到儿童观点,对他的父母说:“嘿,我希望你打开这个表格”,这有点奇怪 - 但是Form1创建并展示了它。

我会做这样的事情:

<强>主窗口:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void start_button_Click(object sender, RoutedEventArgs e)
    {
        Form1 frm = new Form1();
        frm.MyEvent += Form1EventMethod;
        frm.Show();
    }

    private void Form1EventMethod(object sender, EventArgs e)
    {
        // You can add here what you need to change in the MainWindow.

        Form2 frm = new Form2();
        frm.Show();
    }
}

<强> Form1中:

public partial class Form1 : Window
{
    public event EventHandler MyEvent;

    public Form1()
    {
        InitializeComponent();
    }

    private void show_form_Click(object sender, EventArgs e)
    {
        if(MyEvent != null)
            MyEvent(this, new EventArgs());
    }
}

此外,如果您想在引发此事件时执行某些操作,则可以订阅的不仅仅是MainWindow。此外,您可以将不同的参数传递给订阅者。您的观点将被分开,而不是依赖于彼此。

答案 2 :(得分:0)

我知道你的意思,你想从WPF应用程序主窗口调用窗口表单。我已经准备好了这个测试程序,以帮助您了解如何以编程方式实现这一目标。

考虑以下简单程序: 1)取2个数字作为用户输入(使用TextBoxes)。 2)以自定义窗口形式显示结果,该窗体弹出以响应计算按钮。

当用户按下“计算”按钮(此答案中未显示)时,程序会添加2号码,然后以自定义窗口形式显示结果(其作用类似于对话框)。

假设您正在寻找的是响应用户点击的caculateclick方法:

在MainWindow.xaml.cs中:

    private void calculateClick(object sender, RoutedEventArgs e)
    {

        try
        {   
            int leftHandSide = System.Int32.Parse(lhsOperand.Text); //user input
            int rightHandSide = System.Int32.Parse(rhsOperand.Text); // lhsOperand and rhsOperand are just references to TextBoxes that takes user input
            string  result_txt=addValues(leftHandSide,rightHandSide).ToString(); // add two numbers that returns the result
           //addValues method is not defined in my answer, it's just a method I use in this example to add 2 values together     

            CustomDialog.show(result_txt); // diplays result in a custom window form
        }

        catch (FormatException exception )
        {
            exception.ToString();

        }

您需要做的就是为用户定义的Form创建一个类,然后在此类中定义show static方法,主窗口将从上面的caculateClick()方法调用 (我会告诉你代码只是继续阅读)。注意调用静态方法'CustomDialog.show(result_txt);'

CustomDialog是一个部分类(就像您创建的Form1类一样)以用户定义的形式显示添加的结果,该形式将像对话框一样工作。 (我假设您知道使用Visual Studio中的设计视图设计表单的用户界面。)

以下是CustomDialog的代码:

      public partial class CustomDialog : Form // CustomDialog 
         {
           static CustomDialog MsgBox; //used in show method as a reference
            static DialogResult result; //retuned by show method

    public CustomDialog()
             {
              InitializeComponent();
              result = DialogResult.OK; //initialise the result according to the function of the button, here I only use the OK button to close the dialog       }

    public static DialogResult show (string calculationResult) // show static method called by the Main Window  
        {
        MsgBox = new CustomDialog();
        MsgBox.result_text.Text = calculationResult; // result_text is a textbox implemented in the form using design view
        MsgBox.StartPosition = FormStartPosition.CenterParent; // center dialog in the middle of the parent (WPF application main window)
        MsgBox.ShowDialog(); // displays the dialog
        return result; // returns the result so the button event is handled 
         }

我们在CustomDialog类中定义了两个字段, static CustomDialog MsgBox; static DialogResult result; MsgBox对象用于名为'show(string calculation)'的静态方法,以显示对话框并返回'result'变量,这是一个DialogResult对象。 (返回DialogResult,这样我们就可以在TextBox中看到结果并处理事件点击)。

重要说明: 为了避免任何错误,使用以下方法维护表单至关重要,这些方法执行一些后台工作并处理对话框上的按钮单击和标签点击(即使您不打算使用它们,您也可以将它们留空)。 还要确保WPF应用程序的'CustomDialog'和'MainWindow'在SAME名称空间中实现

考虑将以下方法添加到CustomDialog类中作为良好做法,以防您遇到一些错误:

    private void Form1_Load(object sender, EventArgs e) // the name of this method depends on what you name it when you first create the form
    { 

    }

    private void button1_Click(object sender, EventArgs e)
    {
       result = DialogResult.OK; // handle result returned by show() method, here I only used an OK button
       MsgBox.Close(); //closes the dialogbox


    }

    private void label1_Click(object sender, EventArgs e)
    {


    }

设计说明:在“设计视图”中创建表单时要小心,必须在Visual Studio的“属性”选项卡的“其他”部分中将拖动的按钮指定为“按钮”按钮。另请注意,我将MessageBox,Dialogbox和Form称为同一实体。实际上,如果仔细检查我的代码,'MsgBox'静态变量是一个CustomDialog对象。

很抱歉很长的帖子,但希望这有帮助!如果你需要屏幕截图来告诉你它有用,如果有用,请告诉我。