当前位置: 首页 > wzjs >正文

网站建设403国企网站的建设

网站建设403,国企网站的建设,爱站网怎么使用,做网站是用什么语言做成的文章目录实现方法**方法 :重写 OnClosing 方法****子窗口(SettingView)代码****父窗口(MainWindow)代码****关键点****适用场景**为什么if (Owner null || !Owner.IsLoaded)能够判断父窗口已经关闭**1. Owner null 检…

文章目录

    • 实现方法
      • **方法 :重写 `OnClosing` 方法**
        • **子窗口(SettingView)代码**
        • **父窗口(MainWindow)代码**
      • **关键点**
      • **适用场景**
    • 为什么if (Owner == null || !Owner.IsLoaded)能够判断父窗口已经关闭
      • **1. `Owner == null` 检查**
      • **2. `!Owner.IsLoaded` 检查**
      • **为什么 `Owner` 不会自动置 `null`?**
      • **正确的判断逻辑**
      • **特殊情况**
      • **总结**
    • 应用程序退出会自动关闭所有窗口吗,怎么知道先关父窗口还是先关子窗口呢
    • **1. 应用程序退出时,所有窗口会自动关闭吗?**
    • **2. 如何知道先关闭父窗口还是子窗口?**
      • **验证示例**
    • **3. 如何控制关闭顺序?**
      • **方法 1:手动管理关闭顺序**
      • **方法 2:阻止子窗口自动关闭**
    • **4. 关键总结**
    • **5. 最佳实践**

实现方法

在 WPF 中,如果希望窗口点击关闭按钮时 隐藏 而不是真正关闭,并且只有当 父窗口关闭时才真正退出,可以通过以下方式实现:


方法 :重写 OnClosing 方法

在子窗口(SettingView)中重写 OnClosing,判断是否由父窗口触发关闭,如果不是则取消关闭并隐藏窗口。

子窗口(SettingView)代码
public partial class SettingView : Window
{public SettingView(){InitializeComponent();}protected override void OnClosing(CancelEventArgs e){// 如果父窗口正在关闭,则允许子窗口关闭if (Owner == null || !Owner.IsLoaded){base.OnClosing(e);return;}// 否则隐藏窗口,并取消关闭操作e.Cancel = true;this.Hide();}
}
父窗口(MainWindow)代码
public partial class MainWindow : Window
{private SettingView _settingView;public MainWindow(){InitializeComponent();_settingView = new SettingView { Owner = this };}private void ShowSettingView_Click(object sender, RoutedEventArgs e){_settingView.Show(); // 显示窗口(如果已隐藏)}protected override void OnClosed(EventArgs e){base.OnClosed(e);_settingView.Close(); // 父窗口关闭时,真正关闭子窗口}
}

关键点

  1. Owner 属性:子窗口必须设置 Owner = this(父窗口),否则无法判断父窗口是否关闭。
  2. IsLoaded 检查:确保父窗口仍然存在,避免 NullReferenceException
  3. Hide() 代替 Close():点击关闭按钮时隐藏窗口,而不是销毁。
  4. 父窗口关闭时真正关闭子窗口:在父窗口的 OnClosed 中调用 Close()

适用场景

  • 设置窗口:点击关闭按钮时隐藏,下次打开时恢复状态。
  • 工具窗口:不希望频繁创建和销毁窗口,提高性能。
  • 模态对话框:保持数据状态,直到父窗口关闭。

为什么if (Owner == null || !Owner.IsLoaded)能够判断父窗口已经关闭

1. Owner == null 检查

  • Owner 是 WPF 窗口的一个属性,表示当前窗口的父窗口。
  • 如果 父窗口从未被设置(即 Owner 从未赋值),则 Owner == nulltrue
  • 如果 父窗口已被关闭,WPF 不会自动将 Owner 设为 null,所以 Owner == null 通常不会为 true(除非手动置空)。

结论Owner == null 主要用于检测 是否从未设置父窗口,而不是检测父窗口是否关闭。


2. !Owner.IsLoaded 检查

  • IsLoaded 是 WPF 窗口的一个属性,表示窗口是否已经加载并显示。
  • 父窗口关闭时,它的 IsLoaded 会变为 false(即使 Owner 仍然指向它)。
  • 因此,!Owner.IsLoaded 可以判断 父窗口是否已关闭

结论!Owner.IsLoaded 是检测父窗口是否关闭的关键条件。


为什么 Owner 不会自动置 null

  • WPF 的 Owner 属性是一个 弱引用(Weak Reference),它不会阻止垃圾回收(GC)。
  • 父窗口关闭后Owner 仍然会保留对它的引用(只是 IsLoaded 变为 false)。
  • 如果父窗口被垃圾回收,Owner 也不会自动变成 null(除非手动赋值 Owner = null)。

正确的判断逻辑

if (Owner == null || !Owner.IsLoaded)
{// 情况1:从未设置父窗口(Owner == null)// 情况2:父窗口已关闭(!Owner.IsLoaded)base.OnClosing(e); // 允许关闭
}
else
{e.Cancel = true;  // 取消关闭this.Hide();      // 隐藏窗口
}

特殊情况

  1. 如果父窗口从未设置(Owner == null
    • 子窗口会直接关闭(因为没有父窗口需要等待)。
  2. 如果父窗口已关闭(!Owner.IsLoaded
    • 子窗口也会关闭(因为父窗口已经不存在了)。
  3. 如果父窗口仍然存在(Owner != null && Owner.IsLoaded
    • 子窗口会隐藏(Hide()),而不是关闭。

总结

条件含义
Owner == null从未设置父窗口
!Owner.IsLoaded父窗口已关闭(或未加载)
!Owner.IsVisible父窗口不可见(可能是最小化或隐藏)
!Owner.IsActive父窗口未激活(不是当前焦点窗口)

if (Owner == null || !Owner.IsLoaded) 是一个 合理且安全 的方式来判断父窗口是否关闭。 ✅


应用程序退出会自动关闭所有窗口吗,怎么知道先关父窗口还是先关子窗口呢

在 WPF 中,窗口关闭顺序和应用程序退出的行为取决于 窗口的所有权关系(Owner关闭逻辑。以下是关键问题的解答:


1. 应用程序退出时,所有窗口会自动关闭吗?

是的,但取决于关闭方式:

  • 正常关闭(Application.Current.Shutdown()
    所有窗口(包括隐藏的)会按 反向顺序 关闭(子窗口先关闭,父窗口后关闭)。
  • 强制关闭(Environment.Exit(0) 或进程终止)
    所有窗口 立即销毁,不触发 Closing 事件。

2. 如何知道先关闭父窗口还是子窗口?

WPF 的窗口关闭顺序遵循 从子到父 的规则:

  1. 子窗口先关闭(如果设置了 Owner)。
  2. 父窗口后关闭

验证示例

// 父窗口(MainWindow)
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();var childWindow = new ChildWindow { Owner = this };childWindow.Show();}protected override void OnClosing(CancelEventArgs e){Console.WriteLine("父窗口正在关闭");base.OnClosing(e);}
}// 子窗口(ChildWindow)
public partial class ChildWindow : Window
{protected override void OnClosing(CancelEventArgs e){Console.WriteLine("子窗口正在关闭");base.OnClosing(e);}
}

输出

子窗口正在关闭
父窗口正在关闭

👉 结论:子窗口先关闭,父窗口后关闭。


3. 如何控制关闭顺序?

方法 1:手动管理关闭顺序

如果希望 父窗口关闭时,子窗口才关闭(而不是相反),可以:

// 父窗口(MainWindow)
protected override void OnClosing(CancelEventArgs e)
{// 先关闭所有子窗口foreach (Window window in OwnedWindows){window.Close();}base.OnClosing(e);
}

方法 2:阻止子窗口自动关闭

如果希望 子窗口在父窗口关闭时保持存活(例如隐藏而非关闭):

// 子窗口(ChildWindow)
protected override void OnClosing(CancelEventArgs e)
{if (Owner != null && Owner.IsVisible){e.Cancel = true;  // 取消关闭this.Hide();      // 隐藏窗口}else{base.OnClosing(e); // 父窗口已关闭,允许子窗口关闭}
}

4. 关键总结

行为说明
默认关闭顺序子窗口 → 父窗口(反向依赖顺序)
Owner 的作用决定窗口的父子关系,影响关闭顺序
Application.Current.Shutdown()触发所有窗口按顺序关闭
Environment.Exit(0)强制终止,不触发 Closing 事件
隐藏窗口是否影响关闭?隐藏的窗口仍然会被关闭,除非手动取消 Closing

5. 最佳实践

  • 如果子窗口需要存活(如工具窗口):
    • Closing 事件中 Hide() + e.Cancel = true
  • 如果子窗口必须随父窗口关闭
    • 让 WPF 自动处理(默认行为)。
  • 如果需要自定义关闭顺序
    • 在父窗口 OnClosing 中手动关闭子窗口。

这样就能精准控制 WPF 窗口的关闭逻辑! 🚀

http://www.dtcms.com/wzjs/570963.html

相关文章:

  • 网吧网站怎么做的三明做网站公司
  • 宜春网站开发中国建设工程招标网官网
  • 商丘建网站数据网站建设哪家好
  • flash 做ppt的模板下载网站有哪些营销型手机网站建设
  • 网站建设通知做外贸都用什么网站
  • 家居网站建设定位分析论文西宁整站优化
  • 服务专业的网站建站公司免费微网站开发平台
  • wordpress英文站源码想要网站导航正式推广
  • 五屏网站建设价位wordpress禁用woff
  • 毕设 网站开发的必要性山东建设人才网站
  • 镇江网站建设找思创建设云企业服务平台
  • 阿里巴巴怎样做网站广告营销推广方案
  • 平台网站怎么建设成都网站注册
  • 鄞州区网站建设如何自己开公众号
  • 运城市住房和城乡建设局网站国内手机app开发公司
  • 响应适网站开发你就知道首页
  • 网站网页栅格化关闭wordpress用户注册
  • 做网站一般用什么软件wordpress博客页面无法显示
  • 已有域名怎么建设网站wordpress更换域名教程
  • flash里面如何做网站链接详情页设计教程
  • 商城网站开发视频网站上传的流程图
  • 页面设计网站素材厦门软件园多客宝网站开发
  • 如何用asp.net做网站网站手绘教程
  • 网站备案名称中国开头如何做网站微信支付
  • 校园门户网站开发需求分析深圳网站建设简介
  • 做c语言题目的网站深圳地图
  • 网站平台建设成本网站建设seo视频
  • 高端网站建设 磐石网络专注建设网站西丽
  • 网站做好是需要续费的吗展示类网站模板js
  • 网站建设便宜不可信wordpress音乐模板