WPF中Closing窗体时调用Hide()方法异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中Closing窗体时调用Hide()方法异常相关的知识,希望对你有一定的参考价值。

参考技术A

  有朋友遇到这样的一个问题 在WPF中 当Closing一个窗体时 将e Cancel=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;  //  this willHide = new WillHide(this HideWin );  //  private void HideWin ()     this win Hide();    当Closing时我们这样    void win _Closing(object sender CancelEventArgs e)      e Cancel = true;   Dispatcher BeginInvoke(System Windows Threading DispatcherPriority Normal this willHide);   Everything is OK!

  整体的代码   Code  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 Window xaml   /// </summary>   public partial class Window : Window      delegate void WillHide();

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

  public Window ()      InitializeComponent();

  Test();  

  private void HideWin ()      this win Hide();  

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

  this willHide = new WillHide(this HideWin );

  this win Closing += new CancelEventHandler(win _Closing);

  this btnShowWin Click += new RoutedEventHandler(btnShowWin _Click);

  this win Show();

  

  void btnShowWin _Click(object sender RoutedEventArgs e)      this win Show();  

  void win _Closing(object sender CancelEventArgs e)      e Cancel = true;   Dispatcher BeginInvoke(System Windows Threading DispatcherPriority Normal this willHide);  

lishixinzhi/Article/program/ASP/201311/21706

WPF 窗口位置绑定

【中文标题】WPF 窗口位置绑定【英文标题】:WPF window location binding 【发布时间】:2011-07-19 09:07:38 【问题描述】:

在 windows 窗体中,窗体的属性部分有一个选项,用于在应用程序设置和 windows 窗体之间建立绑定。

通常我会得到一个名为 frmMyFormName_Location 的设置,然后它会根据需要自动更新,我需要做的就是在应用程序退出时调用 Settings.Save() 方法来保存位置。

有人可以提供一个 WPF 中相同事情的示例吗,因为我无法弄清楚如何实现这一点?

【问题讨论】:

【参考方案1】:

以下链接可能有助于存储应用程序设置。 WPF 窗口中没有一个名为 Location 的属性,但您确实有一个 LocationChanged 事件,您可以相应地处理和编写代码。

一个粗略的例子是:

private void Window_LocationChanged(object sender, EventArgs e)
        
            var left = (double)GetValue(Window1.LeftProperty);
            var top = (double)GetValue(Window1.TopProperty);
             // persist these values
             . . .
        

对于持久应用程序设置:

c# - approach for saving user settings in a WPF application? wpf 应用程序中的设置

WPF Application Settings File

Where to store common application settings

【讨论】:

虽然我真诚地感谢您的意见,但我希望找到一种通过绑定以声明方式执行此操作的方法。 我努力寻找这样的样本,但不幸的是,大多数人似乎都在使用代码来实现这一点。也看看这个:codeproject.com/KB/WPF/SaveRestoreWPFWindowSize.aspx【参考方案2】:

从 WPF 中的 .settings 文件绑定到用户或应用程序设置非常简单。

这是一个从设置中获取位置和大小的窗口示例:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:settings="clr-namespace:WpfApplication1.Properties"
        Height="Binding Height, Source=x:Static settings:Settings.Default, Mode=TwoWay" 
        Width="Binding Width, Source=x:Static settings:Settings.Default, Mode=TwoWay"
        Top="Binding Top, Source=x:Static settings:Settings.Default, Mode=TwoWay"
        Left="Binding Left, Source=x:Static settings:Settings.Default, Mode=TwoWay">
    <Grid>

    </Grid>
</Window>

设置如下:

为了坚持,我只是使用以下代码:

void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)

    Properties.Settings.Default.Save();

【讨论】:

也适用于 WindowsState(正常、最小化、最大化)。使用 PresentationFramework 中的枚举:System.Windows.WindowState【参考方案3】:

这是 WPF VB.NET 的示例

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns:Properties="clr-namespace:WpfApplication1"

    Title="Test" 
    Loaded="Window_Loaded" Closing="Window_Closing"      
    Height="Binding Height, Source=x:Static Properties:MySettings.Default, Mode=TwoWay"
    Width="Binding  Width,Source=x:Static Properties:MySettings.Default,  Mode=TwoWay"
    Left="Binding  Left,Source=x:Static Properties:MySettings.Default,  Mode=TwoWay"
    Top="Binding Top, Source=x:Static Properties:MySettings.Default,  Mode=TwoWay"
    >

<Grid Name="MainFormGrid"> ...

【讨论】:

以上是关于WPF中Closing窗体时调用Hide()方法异常的主要内容,如果未能解决你的问题,请参考以下文章

WPF程序 当关闭一个窗体后,重新打开报错 关闭窗口之后无法设置 Visibility 或者调用 Show或ShowDialog

wpf中 closing事件和unload事件有啥区别?

WPF 窗口位置绑定

C# WPF.MDI,点击关闭按键后,如何在Closing中取消该关闭操作?

wpf登录窗体跳转怎么做

WPF的WebBrowser屏蔽弹出脚本错误窗体