打开一个新窗口,但不总是打开它的新实例

本文关键字:实例 新实例 窗口 一个 新窗口 | 更新日期: 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访问的应用程序对象中打开的窗口。