[WPF疑难]Hide me! not close

简介: 原文 [WPF疑难]Hide me! not close [WPF疑难]Hide me! not close                               周银辉 有朋友遇到这样的一个问题,在WPF中,当Closing一个窗体时,将e.Cancel=true,然后再调用Hide()方法,以便隐藏窗口而不是关 闭,但报异常了:“当Window Closing时不能设置Visibility,或调用Show(),Close(),Hide()方法”。

原文 [WPF疑难]Hide me! not close

[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!

整体的代码:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel;

namespace ClosingDemo
{
    
/// <summary>
    
/// Interaction logic for Window1.xaml
    
/// </summary>

    public partial class Window1 : Window
    
{
        
delegate void WillHide();

        
private Window2 win2 = new Window2();
        
private WillHide willHide;

        
public Window1()
        
{
            InitializeComponent();

            Test();
        }


        
private void HideWin2()
        
{
            
this.win2.Hide();
        }



        
private void Test()
        
{
            App.Current.MainWindow 
= this;
            App.Current.ShutdownMode 
= ShutdownMode.OnMainWindowClose;

            
this.willHide = new WillHide(this.HideWin2);

            
this.win2.Closing += new CancelEventHandler(win2_Closing);

            
this.btnShowWin2.Click += new RoutedEventHandler(btnShowWin2_Click);
           

            
this.win2.Show();

        }


        
void btnShowWin2_Click(object sender, RoutedEventArgs e)
        
{
            
this.win2.Show();
        }


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

        
       
    }

}

目录
相关文章
|
C#
WPF - 模板查看工具:Show Me The Template及如何查看第三方主题
原文:WPF - 模板查看工具:Show Me The Template及如何查看第三方主题   在学习WPF的模板(DataTemplate、ItemsPanelTemplate、ControlTemplate)时,经常会想看看WPF内建的控件模板。
1745 0
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
684 0
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
326 1
|
C# Windows
WPF技术之RichTextBox控件
WPF RichTextBox是Windows Presentation Foundation (WPF)中提供的一个强大的文本编辑控件,它可以显示富文本格式的文本,支持多种文本处理操作。
922 0
|
前端开发 C# 容器
浅谈WPF之控件拖拽与拖动
使用过office的visio软件画图的小伙伴都知道,画图软件分为两部分,左侧图形库,存放各种图标,右侧是一个画布,将左侧图形库的图标控件拖拽到右侧画布,就会生成一个新的控件,并且可以自由拖动。那如何在WPF程序中,实现类似的功能呢?今天就以一个简单的小例子,简述如何在WPF中实现控件的拖拽和拖动,仅供学习分享使用,如有不足之处,还请指正。
441 2
|
开发框架 缓存 前端开发
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉列表的数据绑定以及自定义系统字典列表控件
|
C# 开发者 Windows
一款基于Fluent设计风格、现代化的WPF UI控件库
一款基于Fluent设计风格、现代化的WPF UI控件库
409 1
|
C# Windows
WPF中如何使用HandyCotrol控件库
WPF中如何使用HandyCotrol控件库
672 1
|
开发框架 前端开发 JavaScript
WPF应用开发之控件动态内容展示
WPF应用开发之控件动态内容展示
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件