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

本文关键字:窗体 第一个 第二个 Windows WPF | 更新日期: 2023-09-27 18:04:12

可能我没有在标题中说明清楚,如果需要的话可以更改。现在我开始解释:

我有一个程序做在WPF(原因图形)。主窗口用按钮打开第一个表单,表单1做一些事情,改变主窗口的UI,当它完成后应该打开一个表单2,它也应该做一些事情改变主窗口的UI,但我不能通过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在主窗口中调用一个void,但没有。我该怎么做?注意:需要用Form2改变主窗口的UI,我需要Form2只在Form1计算结束时打开。

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

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

如果您试图从主窗口打开一个窗口,我建议您使用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());
    }
}

同样地,如果你想在这个事件被触发时做一些事情,你可以订阅不仅仅是主窗口。此外,还可以向订阅者传递不同的参数。你的视图将被分开,而不是相互依赖。

我知道你的意思,你想从WPF应用程序主窗口调用窗口窗体。我准备了这个测试程序,以帮助您了解如何通过编程实现这一点。

考虑下面的简单程序:1)取2个数字作为用户输入(使用文本框)。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(字符串计算)的静态方法中使用,以显示对话框并返回'result'变量,该变量是一个dialgresult对象。(返回dialog sult,这样我们就可以在文本框中看到结果并处理事件点击)。

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

考虑将以下方法添加到您的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)
    {

    }

Design Notes:要小心,当你在Design View中创建表单时,你必须在Visual Studio的Properties选项卡的Misc部分将你拖拽到它的按钮分配为Acceptbutton。还请记住,我将MessageBox, Dialogbox和Form作为相同的实体。实际上,如果你仔细检查我的代码,'MsgBox'静态变量是一个CustomDialog对象。

很抱歉写了这么长时间,但希望这对你有帮助!如果你需要屏幕截图来展示它的工作原理,如果它有帮助,请告诉我。