WPF - C# - 只打开一次父窗口

时间:2014-03-06 10:09:12

标签: c# wpf

我在C#和WPF中编写一个简单的东西。我有一个带按钮的MainWindow。如果我触发按钮,它会打开一个secon窗口:

private void btnF4_Click(object sender, RoutedEventArgs e)
{
     SecondWindow second = new SecondWindow();
     second.Show();
}

当然,如果我触发按钮三到四次,我会打开三个或四个窗口。我不想使用ShowDialog(),但我想只打开第二个窗口一次。我的意思是,如果我触发按钮并且窗口已经打开,则应该没有任何反应。

谢谢!

2 个答案:

答案 0 :(得分:1)

second实例变量设为父窗口类,只创建一个新窗口(如果尚未创建)。

当然,当第二个窗口关闭时,你需要确保null实例变量。

public class ParentWindow ...
{
    private SecondWindow m_secondWindow = null;

    ....

    private void btnF4_Click(object sender, RoutedEventArgs e)
    {
        if (m_secondWindow == null)
        {
            m_secondWindow = new SecondWindow();
            m_secondWindow.Closed += SecondWindowClosed;
            m_secondWindow.Show();
        }
    }


    public void SecondWindowClosed(object sender, System.EventArgs e)
    {
        m_secondWindow = null;
    }
}    

这可能会缩短为以下几点:

public class ParentWindow ...
{
    private SecondWindow m_secondWindow = null;

    ....

    private void btnF4_Click(object sender, RoutedEventArgs e)
    {
        if (m_secondWindow == null)
        {
            m_secondWindow = new SecondWindow();
        }

        m_secondWindow.Show();            
    }
}    

但是,我不确定你是否真的可以“重新开启”之前关闭的窗口。如果需要在重新打开时重新初始化窗口,请使用第一个代码。如果您可以使用显示先前内容的窗口,请使用第二个。

答案 1 :(得分:0)

在父窗口类中声明SecondWindow而不是方法。

public class MainWindow : Window {
     SecondWindow second = new SecondWindow();

     private void btnF4_Click(object sender, RoutedEventArgs e) {
          if (!second.IsActive) {
               second.Show();
          }
     }
}

在方法中声明second将使second窗口在该方法中处于本地状态,这意味着每次单击该按钮都会创建该类的新实例(窗口)