WPF中如何从Page页面实现窗口最小化?
WPF Page页面实现窗口最小化的正确方法
你的代码运行崩溃,核心原因是**this.Parent不一定直接是Window对象**。Page通常嵌套在Frame、NavigationWindow这类容器控件中,直接强制转换为Window会得到null,后续访问WindowState时就会触发空引用异常。
下面是几种可靠的解决方法:
方法一:递归查找顶级父窗口
通过视觉树递归向上查找,找到当前Page所属的Window:
using System.Windows.Media; private Window GetParentWindow(DependencyObject child) { DependencyObject parent = VisualTreeHelper.GetParent(child); while (parent != null && !(parent is Window)) { parent = VisualTreeHelper.GetParent(parent); } return parent as Window; } private void minimizeBtn_Click(object sender, RoutedEventArgs e) { var parentWindow = GetParentWindow(this); // 空值检查,避免崩溃 if (parentWindow != null) { parentWindow.WindowState = WindowState.Minimized; } }
方法二:直接调用主窗口(单窗口场景适用)
如果你的应用只有一个主窗口,可直接通过Application.Current.MainWindow操作:
private void minimizeBtn_Click(object sender, RoutedEventArgs e) { Application.Current.MainWindow.WindowState = WindowState.Minimized; }
方法三:通过NavigationService获取所属窗口
如果Page是通过导航框架加载的,可借助NavigationService获取其所属窗口:
private void minimizeBtn_Click(object sender, RoutedEventArgs e) { var parentWindow = NavigationService?.Owner as Window; if (parentWindow != null) { parentWindow.WindowState = WindowState.Minimized; } }
关键注意事项
所有方法都必须包含空值检查,这是避免空引用崩溃的核心。无论是哪种方式,都要确保获取到的Window对象不为null后再修改其状态。
内容的提问来源于stack exchange,提问作者Actaeon
相关产品推荐
相关产品推荐

