熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

WPF中Closing窗體時調用Hide()方法異常

2013-11-15 12:49:30  來源: ASP編程 

  有朋友遇到這樣的一個問題在WPF中當Closing一個窗體時將eCancel=true然後再調用Hide()方法以便隱藏窗口而不是關閉但報異常了當Window Closing時不能設置Visibility或調用Show()Close()Hide()方法OK本隨筆將幫你解決該問題

  問題的關鍵在於不能再Closing方法中調用Close等那麼只要我們知道用戶有意圖關閉窗體時僅僅再Closing方法中取消關閉然後在Closing緊接著的某個方法中調用Hide就OK了為了體現這個緊接著的某個方法讓我聯想到方法排隊比如多個線程中的方法使用同一個對象時這些方法將被排隊否則異常那麼就用Invoke來幫我們實現這個排隊就OK了

  假設我們的Window類型的win時一個需要隱藏的窗口企圖關閉該窗體時其會被隱藏點擊主窗口上的btnShowWin按鈕時窗體會再次被顯示
  我們實現一個Delegate其代理的方法將異常窗體
  delegate void WillHide();
  //
  private WillHide willHide;
  //
  thiswillHide = new WillHide(thisHideWin);
  //
  private void HideWin()
  {
   thiswinHide();
  }
  當Closing時我們這樣
   void win_Closing(object sender CancelEventArgs e)
   {
   eCancel = true;
   DispatcherBeginInvoke(SystemWindowsThreadingDispatcherPriorityNormal thiswillHide);
   }Everything is OK!

  整體的代碼
  Code
  using System;
  using SystemCollectionsGeneric;
  using SystemLinq;
  using SystemText;
  using SystemWindows;
  using SystemWindowsControls;
  using SystemWindowsData;
  using SystemWindowsDocuments;
  using SystemWindowsInput;
  using SystemWindowsMedia;
  using SystemWindowsMediaImaging;
  using SystemWindowsNavigation;
  using SystemWindowsShapes;
  using SystemComponentModel;

  namespace ClosingDemo
  {
   /**//// <summary>
   /// Interaction logic for Windowxaml
   /// </summary>
   public partial class Window : Window
   {
   delegate void WillHide();

  private Window win = new Window();
   private WillHide willHide;

  public Window()
   {
   InitializeComponent();

  Test();
   }

  private void HideWin()
   {
   thiswinHide();
   }

  private void Test()
   {
   AppCurrentMainWindow = this;
   AppCurrentShutdownMode = ShutdownModeOnMainWindowClose;

  thiswillHide = new WillHide(thisHideWin);

  thiswinClosing += new CancelEventHandler(win_Closing);

  thisbtnShowWinClick += new RoutedEventHandler(btnShowWin_Click);

  thiswinShow();

  }

  void btnShowWin_Click(object sender RoutedEventArgs e)
   {
   thiswinShow();
   }

  void win_Closing(object sender CancelEventArgs e)
   {
   eCancel = true;
   DispatcherBeginInvoke(SystemWindowsThreadingDispatcherPriorityNormal thiswillHide);
   }

  }
  }


From:http://tw.wingwit.com/Article/program/ASP/201311/21706.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.