可能我不会在标题中说清楚,如有必要就改变它。现在我逐步解释:
我在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。
答案 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对象。
很抱歉很长的帖子,但希望这有帮助!如果你需要屏幕截图来告诉你它有用,如果有用,请告诉我。