【问题标题】:WPF Find window instanceWPF 查找窗口实例
【发布时间】:2011-05-26 21:20:53
【问题描述】:

我在一个类中创建了一个窗口的实例,但我无法直接从我的其他类访问该窗口的实例。

有没有一种方法可以引用我已经使用 C# 方法创建的窗口实例,或许可以搜索打开的应用程序窗口,直到找到我尝试访问的仪表板窗口?

【问题讨论】:

  • 总的来说,这听起来像是一个糟糕的设计。可能有更好的方法来完成您正在尝试做的事情。首先告诉我们您从那个窗口需要什么以及为什么其他课程也需要它?您正在做的是编写脆弱、紧密耦合的代码的可靠方法。
  • 我建议对主窗口使用单例模式

标签: c# wpf


【解决方案1】:

Application.Current.Windows 为您提供所有窗口,使用它的类型应该不难找到。

正如 Ed 指出的那样,这听起来不是很好的设计,所以您可能想考虑如何在没有混乱的窗口引用的情况下完成工作

【讨论】:

  • 我在哪里可以在更好的地方构建窗口,以便所有方法都可以访问实例?目前我在一个类中创建实例,但事情已经像你说的那样变得一团糟。我不想在 MainWindow 中构建窗口,因为它只应在需要时创建 - 这是唯一的问题。
  • 您不需要创建它,只需声明一个引用并在实例化窗口后使用它。当然应该在对该引用的任何调用中检查 null,因为它可能还不包含窗口。
  • 我试着像你说的那样做,但是当我尝试从其他类中使用它时,引用不包含我的仪表板窗口,因为它还不存在。我不知道如何才能解决这个问题,并让全班明白窗口将存在。
  • 你不应该欺骗班级认为窗口会存在,因为它不一定存在。正如我所说,在您获得引用的每种情况下,您首先必须检查它是否指向空值。如果这是一个问题,因为窗口应该存在,那么为什么不直接创建它呢?无论如何,如果这一切仍然是一个问题,那么你可能有一个糟糕的设计。
  • 我设法在公共位置创建了窗口引用,B 类接受了这次在 A 类中创建的实例。感谢您的帮助。
【解决方案2】:
System.Reflection.Assembly assemby = System.Reflection.Assembly.GetExecutingAssembly();
System.Type[] types = assemby.GetTypes();
var varWindows = types.ToList()
    .Where(current => current.BaseType == typeof(Window));
MessageBox.Show(varWindows.Count().ToString());

Application.Current.Windows 获取我们所有实例化的窗口,但上面的代码获取我们所有的窗口。

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2017-12-05
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多