我一直在与WPF和MVVM合作一段时间。在我的项目的一部分中,我使用以下代码关闭窗口。但代码有效,我还不了解代码背后的逻辑。我的代码是:
App.Current.Windows.Cast<Window>()
.Where(win => win is DisplayView).FirstOrDefault()
.Close();
为什么需要FirstOrDefault()?
答案 0 :(得分:3)
它只使用一些Linq IEnumerable<T>
扩展来从集合中获取与给定类型匹配的第一个项目,然后在该实例上调用Close
。它实际上是不必要的冗长,因为:
App.Current.Windows.Cast<Window>()
.Where(win => win is DisplayView)
或多或少等同于:
App.Current.Windows.OfType<DisplayView>()
此外,调用FirstOrDefault()
后跟“关闭”有点傻。 FirstOrDefault类似于First
,除非它返回null而不是在没有元素的情况下抛出异常 - 但在这种情况下它会抛出异常,因为你在null对象上调用“Close”。
所以我会这样写:
App.Current.Windows.OfType<DisplayView>().First().Close();
如果你想确认实际上有一个DisplayView实例,并防止在这种情况下发生异常,那么你可以使用它:
var displayViews = App.Current.Windows.OfType<DisplayView>();
if (displayViews.Any())
displayViews.First().Close();
答案 1 :(得分:0)
让我们把它分开:
App.Current
:获取正在运行的WPF应用程序(我认为应该是Application.Current
).Windows.Cast<Window>()
:获取窗口列表,但因为这是一个无类型集合,所以强力键入以使用所有 LINQ 运算符.Where(win => win is DisplayView)
:LINQ运算符用于过滤窗口列表,仅保留DisplayView
类型的.FirstOrDefault()
:获取此集合的第一个元素,如果没有,则获取null
.Close()
:关闭我们获得的窗口,这很危险,因为如果没有找到NullReferenceException
,它会被打击这是一种更安全的方法:
DisplayView view = App.Current.Windows.Cast<Window>()
.Where(win => win is DisplayView)
.FirstOrDefault();
if (view != null)
{
view.Close();
}