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计算结束时打开。
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对象。
很抱歉写了这么长时间,但希望这对你有帮助!如果你需要屏幕截图来展示它的工作原理,如果它有帮助,请告诉我。