[WPF疑难]Hide me! not close

有朋友遇到这样的一个问题,在WPF中,当Closing一个窗体时,将e.Cancel=true,然后再调用Hide()方法,以便隐藏窗口而不是关闭,但报异常了:“当Window Closing时不能设置Visibility,或调用Show(),Close(),Hide()方法”。OK,本随笔将帮你解决该问题。

问题的关键在于不能再Closing方法中调用Close等,那么只要我们知道用户有意图关闭窗体时,仅仅再Closing方法中取消关闭,然后在Closing紧接着的某个方法中调用Hide就OK了。为了体现这个“紧接着的某个方法”,让我联想到方法排队,比如多个线程中的方法使用同一个对象时,这些方法将被排队,否则异常。那么就用Invoke来帮我们实现这个排队就OK了。

假设我们的Window类型的win2时一个需要隐藏的窗口,企图关闭该窗体时其会被隐藏,点击主窗口上的btnShowWin2按钮时窗体会再次被显示。

我们实现一个Delegate,其代理的方法将异常窗体:

delegate void WillHide();
//
private WillHide willHide;
//
this.willHide = new WillHide(this.HideWin2);
//
private void HideWin2()
{
   this.win2.Hide();
}

当Closing时我们这样:

    void win2_Closing(object sender, CancelEventArgs e)
    {
      e.Cancel = true;
      Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, this.willHide);
    }Everything is OK!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索异常
, 方法
, 窗体
, 窗口
, hide
, close
, closed
, 隐藏wpf
一个
qt close hide、c hide close、wpf hide isactive、wpf close、wpf window close,以便于您获取更多的相关知识。

时间: 2024-08-03 18:43:53

[WPF疑难]Hide me! not close的相关文章

[WPF疑难]如何禁用窗口上的关闭按钮

哈哈,主要是调用RemoveMenu这个API,所以没什么好说的,直接"干货"吧: namespace VersatileMessageBoxLib { using System; using System.Windows.Interop; using System.Runtime.InteropServices; public class CloseButton { [DllImport("user32", CharSet = CharSet.Ansi, SetL

[WPF疑难]ErrorTemplate显示与隐藏问题

1,问题描述: 在为Binding提供验证模板时,我们需要使用一个ControlTemplate来为验证控件提供验证反馈,即是当验证失败时在被验证控件的旁边或外围提供一个具有明显视觉效果的UI元素以提醒用户(一个普遍的做法,比如文本框外围出现一个红色线框),这也就是传说中的Validation.ErrorTemplate.按照正常人的思维:ErrorTemplate(红色线框)的可见性应该随着被验证控件(文本框)的可见性的改变而动态改变.但目前事实并非如此,即便是用WPF默认的ErrorTemp

[WPF疑难] 如何限定ListView列宽度

今天遇到的一个Defect是:应该限定List View中列最小宽度以避免用户将列宽度拖拽为0而导致列消失.WPF的List View没有内置该机制,但我们可以通过监听用户拖拽操作来跟踪列宽并进一步限定用户拖拽,我已经搞定了该问题,请参见附件中的DEMO. Demo中的"ListViewLayoutManagerLib"项目已经该操作封装,如何使用该封装,请参考下面的说明(或GridViewCodeDemo.Window1.xaml) 1,将ListViewLayoutManagerL

[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我们将子窗口按照ShowDialog()的方式显示出来的时候,很明显该窗口是模式化的(即主窗口等待该窗口的返回,主窗口将不相应用户输入),但如果此时将子窗口的Visibility设置成Visibility.Hidden来隐藏窗口,然后再将Visibility设置成Visibility.Visible来再次显示子窗口,此后子窗口便是非模式的了(即主窗口和子窗口一样相应用户输入) 案例: 当用户不操作软件达到一定的时间间隔后,软件会隐藏

[WPF疑难] 继承自定义窗口

项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于Window自身的,但每个弹出框的外边框都是一样的.对其中一个窗口而言,我们要取消其Window边框,并在右上角摆上三个按钮并编写其点击事件等,但若每个弹出窗口都按照这种方式做一遍就太土了.我们想避免重复劳动,最自然的联想到了"继承".但WPF给我们找了若干麻烦,被挫败了几次.今天经过2小时的奋战,终于搞定了,分享一下. 挫败1,继承时编译错误 假设我们写好的父窗口类为BaseWindow,对应B

[WPF疑难]避免窗口最大化时遮盖任务栏

WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后(比如很多情况下你会覆盖默认的窗体样式,即不采用Windows默认的边框和最大化最等按钮,来打造个性的窗体),那么最大化窗口后,窗口将铺满整个屏幕而将任务栏盖住.这往往不符合实际要求. 这里有个不错的解决方案解决了该问题,其通过对 WM_GETMINMAXINFO(MSDN: The WM_GETMINMAXINFO message is sent to a window when the siz

[WPF疑难]如何禁用WPF窗口的系统菜单(SystemMenu)

点击窗口左上角图标时弹出来的菜单也就是这里所说的系统菜单(SystemMenu),有时需要禁用(移除)其中的某些或全部菜单项.刚才也有网友问到了这一点,OK,贴代码: 要全部禁用(移除)菜单项请调用SystemMenuManager.RemoveWindowSystemMenu(Window window)方法,想部分禁用(移除)菜单项则调用SystemMenuManager.RemoveWindowSystemMenuItem(Window window, int itemIndex)方法.

[WPF疑难]在WPF中显示动态GIF

在我们寻求帮助的时候,最不愿意听到的答复是:很抱歉,在当前版本的产品中还没有实现该功能... 在WPF中显示动态的GIF图像时便遇到了这样的问题,WPF中强大的Image控件却不支持动态的GIF(其只能显示第一帧).当然,我们可以说WPF强大的动画能力,让我们完全有理由抛弃传统的GIF动画,但如某种情况下如果你觉得使用动态的GIF更合适的话(比如QQ表情,因为GIF是利于保存和传输的),没关系,本篇随笔将帮助你解决这个问题. 1,曾有过的尝试: 我们在实际开发过程中也遇到显示动态GIF的问题.发

WPF框架实现微信公众号多客服实例教程(多图)

利用WPF框架作为前端技术,实现桌面版微信多客服系统.项目采用Prism作为前端框架,采用MVVM模式极好的对UI和逻辑代码分离,使用MefBootstrapper集成的MEF IOC容器,解耦各模块对象.合理利用 IEventAggregator 实现事件和交互.文章在介绍对应功能时候会给出相关实现的参考,读者可以参考改进,引入到自己的项目中. 程序运行界面及功能预览: 一.登陆: 功能:支持记住用户和用户设置,可选择记住用户密码. 实现相关: 自定义登陆窗口,引入Microsoft.Wind