正在获取窗口/窗体的引用
本文关键字:窗体 引用 窗口 获取 | 更新日期: 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;
}
}