获取窗口/表单的参考

时间:2015-12-22 09:52:55

标签: c# wpf winforms

我正在将一些winform代码转换为wpf,在winform代码中我有以下几行

frmStartup parentfrm = (frmStartup)Application.OpenForms["frmstartup"];
if (parentfrm != null)
{
    db = parentfrm.db;
}

我需要将其转换为WPF,有一个名为windowSplash的窗口,旨在替换它,但是将frmstartup更改为windowSplash不起作用。

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

WindowStartup parentfrm = Application.Current.Windows.OfType<WindowStartup>().FirstOrDefault();
if (parentfrm != null)
{
   db = parentfrm.db;
}

这会找到匹配该类型的第一个窗口。如果这对你不起作用(你可能有几个相同类型的窗口),最好的办法就是让你的windows实现某种界面。在我的头上,仅作为一个例子:

public interface IDbWindow
{
   string Key { get; }
   DbContext Db { get; }
}

然后制作Window工具IDbWindow,类似于(在XAML代码隐藏中):

public partial class MyWindow : Window, IDbWindow
{
   public string Key { get; private set; }
   public DbContext Db { get; private set; }

   public MyWindow()
   {
      InitializeComponent();
      Key = "ThisIsTheWindowImLookingFor"; // this key might be set somewhere else, or be passed in the constructor, or whatever
      Db = new MyDbContext(); // for example
   }
}

然后您可以在窗口中搜索特定的Key,而不是窗口类型:

IDbWindow parentfrm = Application.Current.Windows.OfType<IDbWindow>().FirstOrDefault(x => x.Key == "ThisIsTheWindowImLookingFor");
if (parentfrm != null)
{
  db = parentfrm.Db;
}

我还要补充一点,你不应该真正依赖Application.Current.Windows,你应该管理你自己的集合(在这种情况下为IDbWindow,但它可以被称为IDbHolder }),根据需要添加和删除。这将消除您对包含Db实际Windows的对象的依赖性(这在逻辑上没有意义,它们可以是任何东西)。

答案 1 :(得分:1)

您可以使用Application.Current.Windows在应用程序中迭代打开的Windows并检查其名称或类型:

foreach (Window window in Application.Current.Windows)
{
    if (window is TypeOfWindow)
    {
        // do what you want

        break;
    }
}