本文介绍了WPF单例窗体在关闭和再次显示时遇到的界面刷新延迟问题。通过控制窗体的最小化和最大化来触发重绘机制,实现了界面的即时更新。在关闭时隐藏窗体,打开时先加载数据,再进行最小化和最大化操作,有效避免了数据过时显示。同时,配合加载动画,优化了用户体验。
摘要由CSDN通过智能技术生成
1、单例窗体不能够close,close后下次就再也不能打开了。只能通过重写OnClosing方法进行隐藏处理
protected override void OnClosing(CancelEventArgs e)
this.Hide();
e.Cancel = true;
2、窗体隐藏后,再次show出来的时候,重新给界面binding新的值,并不能够及时的显示出来,而是先显示了上一次操作的数据,界面一闪才出现本次要展示的内容,而wpf本身并没有很好的处理方法。
我通过摸索,发现通过控制窗体的最大化和最小化能够刚好去触发windows对桌面元素进行重绘的机制,能够及时的去刷新,达到肉眼可见的更改。
这里我首先在重写OnClosing事件中,将窗体Hide,隐藏后先设置窗体最小化,其次初始化界面元素绑定显示的内容,在将窗体最大化。在这过程中,窗体并没有显示出来,实际上窗体界面内容却已经是刷新过的了。
/// <summary>
/// 当窗口关闭的时候
/// </summary>
/// <param name="e"></param>
protected override void OnClosing(CancelEventArgs e)
//卸载事件
this.Hide();
//设置窗体最小化在最大化能够立即刷新界面显示
instance.WindowState &
单例窗口的关闭不能去杀死释放,所以一般都是重写OnClosing,在里边调用Hide()方法。
而当Hide后,虽然已经在之前清空了界面绑定等内容。但是界面并没有去重绘,使用this.InvalidateVisual()强制重新刷新也没有效果。
其实这个是需要等事件执行完后再去调用Hide(),就能够触发界面刷新。所以使用一个异步,延迟100毫秒等走完OnClosing方法再执行Hide()方法就能够刷新一次界面,在这之前设置界面绑定为空,下一次再调起单例弹窗的时候就不会有上一次的界面遗留,出现一个旧数
MainWindow mainWindow = new MainWindow("/pages/ProductionInfo/ProductionFacts.xaml");
Window window = Window.GetWindow(this);//关闭父窗体
window.Close();
关闭一个窗口之后,不能继续打开,出现如下错误:
System.InvalidOperationException: ‘Cannot set Visibility or call Show, ShowDialog, or WindowInteropHelper.EnsureHandle after a Window has closed.’
解决方法:
在子窗口添加如下函数,...
尝试将Application.ShutMode设置为MainWindowClose,但是问题依然存在
后来发现原来在程序中实例化了一个Thread,这个Thread在循环接收Socket消息
将该Thread设置为isBackground=true 即可