【问题标题】:How to close a window from another class?如何关闭另一个班级的窗口?
【发布时间】:2014-04-25 06:27:27
【问题描述】:

在我的一生中,我找不到解决方案。 我设置了一个类,它可以做几件事,其中之一是对 windows 做某些事情。其中之一是 MainWindow.xaml

如果从 OtherClass.cs 中调用方法,我希望它关闭 MainWindow.xaml。
基本上:我想访问已经实例化的窗口的代码隐藏中的方法。


在我试图从 OtherClass 调用的 Mainwindow.xaml.cs 中:

public void CloseNow()
{
    This.Close();
}

但要访问 MainWindow.xaml.cs 中的任何成员,我需要共享它,但这会破坏让它对窗口 (MainWindow.xaml) 执行任何操作的目的。

我可能忽略了一些事情,但 atm 我似乎没有注意到它。 有人能告诉我处理这种情况的方法吗?

PS 我在 WPF 中工作。


为了澄清,这里是对其中一个答案的评论:

我要做的是在另一个类中运行一个命令,该类是 WPF 窗口的公共成员。该窗口已被实例化并显示。我只想访问它的公共成员,以便为了方便起见,我可以从另一个类操作窗口。我的这个 OtherClass.cs 是一个处理控制台操作的类。控制台是位于 MainWindow.xaml.cs 中的自定义控件。例如,当用户键入:/close 时,我希望 MainWindow.xaml 关闭,但不仅如此,因为将来我想添加更多功能。

【问题讨论】:

    标签: c# wpf oop xaml


    【解决方案1】:

    在您的 OtherClass 中,添加以下方法以关闭主窗口。

    public void CloseMainWindowNow()
    {
      var mainWindow = (Application.Current.MainWindow as MainWindow);
      if (mainWindow != null)
      {
        mainWindow.Close();
      }
    }
    

    【讨论】:

    • 我在 Windows Presentation Foundation 中工作,并且该窗口不存在 Application 对象。你知道替代方案吗?
    • Application 类存在于 wpf 中,您需要使用 System.Windows 来访问它。但我认为Application.Current.RootVisual 仅在 Silverlight 中可用,您可以在 WPF 中使用Application.Current.MainWindow。而如果关闭你的MainWindow退出应用,你也可以直接使用Application.Current.Shutdown()
    【解决方案2】:
    class OtherClass
    {
        private MainClass mainClass;
        public OtherClass(MainClass mainClass)
        {
            this.mainClass = mainClass;
        }
    }
    

    然后就可以在OtherClass中调用mainClass的任意方法了。在您的情况下, MainClass 是您的 MainWindow.Xaml.cs

    在 MainWindow.Xaml.cs 你必须创建 Otherclass otherClass = new OtherClass(this);

    【讨论】:

      【解决方案3】:

      代表可以帮助您。 Windows 窗体中的代码:

      表格1:

      public partial class Form1 : Form
      {
          Form2 form2;
          public Form1()
          {
              InitializeComponent();
              form2 = new Form2(Closing);
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              form2.ShowDialog();
          }
          private void Closing()
          {
              this.Close();
          }
      }
      

      表格2:

      public partial class Form2 : Form
      {
          public delegate void Close();
          Close close;
          public Form2(Close close)
          {
              InitializeComponent();
              this.close = close;
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              close();
          }
      }
      

      所以,当你在 form2 上按下 button1 时,它将使用方法 close(),thaw 是从 form1 委托的,因此它将使用 form1 上的方法 Closing 并关闭 form1。

      【讨论】:

      • 使用委托对我来说很不方便,因为第二类(OtherClass.cs)不是表单。我必须编写很多 OtherClass.cs 需要访问的方法。您可能知道另一种选择吗?
      • 在OtherClass构造函数中传递对mainwindow.xaml.cs的引用,然后可以在OtherClass中调用mainwindow的任何方法,如Close()等。我在其他答案中发布的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 2018-07-24
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多