打开一个新窗口,但不总是打开它的新实例
本文关键字:实例 新实例 窗口 一个 新窗口 | 更新日期: 2023-09-27 18:20:09
我还处于c#的学习阶段,所以如果你认为这是一个愚蠢的问题,不要开枪打我;-)
在这个项目中,我有一个主窗口,和一个名为"window1"的新窗口
在主屏幕上,我做了一个按钮,它会像这样进入窗口1:
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 W1 = new Window1();
W1.Show();
this.Close();
}
现在,这正如预期的那样工作,创建window1的新实例并在关闭主窗口时显示它。
但问题是:在window1中,有些东西可能会发生变化,比如用户单击的按钮,然后当显示新按钮时,该按钮会被隐藏。
我还在window1上做了一个后退按钮,它使用与上面相同的代码返回到主窗口(所以现在是新的window1,但是新的主窗口)
但在这一点上,当我再次点击main按钮进入window1时,window1回到了默认状态。对我来说似乎很合理,因为它在使用按钮时会创建一个新实例。
但是,如果我想再次打开window1的第一个实例,即已经被用户更改的实例,我应该怎么做呢?
首先,我想把Window1 W1 = new Window1();
放在按钮方法之外,但由于"后退"按钮,这也不起作用。
我希望我能很好地解释我要做的事情
有什么想法吗?
=====================
编辑1:
使用"chrfin"中的代码示例有些部分会产生错误,如"可见=真实"部分也许这是因为我使用express2010,或者是因为我用的是WPF而不是表单?
主要是:
Window1 W1 = null; // Initialise Field.
private void CalcTabel_Click(object sender, RoutedEventArgs e)
{
if (W1 == null)
{
W1 = new Window1();
W1.MainWindow = this; //ERROR
W1.Show();
}
else
W1.Visibility = Visibility.Visible;
this.Visibility = Visibility.Hidden;
}
在窗口1 中
public MainWindow w1 { get; set; }
private void Quit_Click(object sender, RoutedEventArgs e)
{
w1.Visibility = Visibility.Visible;
this.Visibility = Visibility.Hidden;
}
现在我在主要部分得到的错误是:"WpfApplication1.Window1"不包含"MainWindow"的定义,该定义接受了类型为"WpfApplication 1.Window1"的第一个参数(是否缺少using指令或程序集引用?)
只要删除那个错误行,就会导致get,set部分什么都得不到。
有什么想法吗?
=====================
编辑1:
Thanx再次"chrfin"现在开始工作了:)
主要:
Window1 W1 = null; // Initialise Field.
private void CalcTabel_Click(object sender, RoutedEventArgs e)
{
if (W1 == null)
{
W1 = new Window1();
W1.Hoofdmenu = this;
W1.Show();
}
else
W1.Visibility = Visibility.Visible;
this.Visibility = Visibility.Hidden;
}
在Window1:中
public MainWindow Hoofdmenu { get; set; }
private void Quit_Click(object sender, RoutedEventArgs e)
{
Hoofdmenu.Visibility = Visibility.Visible;
this.Visibility = Visibility.Hidden;
}
- 已解决-
您可以这样做:
Window1 w1 = null;
private void Button_Click(object sender, RoutedEventArgs e)
{
if(w1 == null)
{
w1 = new Window1();
w1.MainWindow = this; //create this property - see below
w1.Show();
}
else
w1.Visible = true;
this.Visible = false;
}
和Window1:内部
public MainWindow MainWindow { get; set; }
private void ButtonBack_Click(object sender, RoutedEventArgs e)
{
this.Visible = false;
MainWindow.Visible = true;
}
有很多方法可以实现所需的结果。我将使用的方法如下:
Window1 W1 = null; // Initialise Field.
private void Button_Click(object sender, RoutedEventArgs e)
{
if (W1 == null) W1 = new Window1();
W1.Show();
this.Close();
}
您也可以取消该事件。
这里可以有多个解决方案。
1) 您可以在Windows1中保留用户所做的更改。每当您重新启动Window1时,都会将设置或以前的更改传递给它,以便Window1可以根据最后的状态重新调整自己
2) 不要总是创建Window1的新实例并在后退按钮上关闭它,只需使用show和hide使Window1对用户可见和不可见
创建一个静态属性来存储W1的引用,并在Button_Click
方法中检查它是否有值,否则使用它创建一个新的值;
另一种选择是查看可通过Application.Current.Windows
访问的应用程序对象中打开的窗口。