正在获取窗口/窗体的引用

本文关键字:窗体 引用 窗口 获取 | 更新日期: 2023-09-27 18:27:39

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

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

我需要将其转换为WPF,有一个名为windowSplash的窗口是为了取代它而设计的,但是将frmstartup更改为windowsSplash是不起作用的。

正在获取窗口/窗体的引用

您可以执行以下操作:

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

不过,这将找到与类型匹配的第一个窗口。如果这对你不起作用(你可能有几个相同类型的窗口),最好的方法是让你的窗口实现某种接口。在我的脑海中,举个例子:

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的依赖(这在逻辑上没有意义,它们可能是任何东西)。

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

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