this.Close();在wpf

时间:2015-11-20 09:37:43

标签: c# wpf

在wpf窗口中,我正在调用窗口窗体。在打电话之前我只想关闭那个窗口。这是我的代码。

  public partial class MainWindow : MetroWindow
  {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void BtnIntroClick(object sender, RoutedEventArgs e)
        {

            PdfReader form = new PdfReader(1);

            form.ShowDialog();
            this.Close();

        }
   }

没有错误,但表单没有关闭。 并且在窗口形式中,this.Close()无法正常工作

 public partial class PdfReader : Form
 {
        public PdfReader(int page_num)
        {
            InitializeComponent();
            var executingFolder = System.AppDomain.CurrentDomain.BaseDirectory;
            var dbPath = System.IO.Path.Combine(executingFolder, "BiodermaProduct.pdf");
            axAcroPDF1.LoadFile(dbPath);

            axAcroPDF1.setCurrentPage(page_num);
        }

        private void PdfReader_FormClosed(object sender, FormClosedEventArgs e)
        {
           this.Opacity = 0;
           MainWindow w = new MainWindow();
           w.ShowDialog();

        }
 }

5 个答案:

答案 0 :(得分:5)

关闭PdfReader form时会关闭。 Form.ShowDialog仅在表单关闭时返回。因此在this.Close()完成之前不会调用ShowDialog 在调用this.Visibility = Visibility.Hidden

之前,您可以设置form.ShowDialog();

答案 1 :(得分:1)

当您使用Window.ShowDialog()时,它会以模态方式调用新窗口,这意味着您无法转到父窗体。

Window.Show()函数以非模态形式显示表单。这意味着您可以单击父表单。

但是,此代码将以 MSDN says 关闭您的应用程序(感谢@Empereur Aiman):

  

OnMainWindowClose的ShutdownMode会导致Windows演示文稿   Foundation(WPF)在MainWindow时隐式调用Shutdown   关闭,即使其他窗口当前打开

您应该将ShutdownMode设为OnLastWindowCloseMSDN says

  

如果将ShutdownMode设置为OnLastWindowClose,则为Windows Presentation   Foundation(WPF)在最后一个窗口中隐式调用Shutdown   应用程序关闭,即使设置了任何当前实例化的窗口   作为主窗口(参见MainWindow)。

只需重新调整您对ShowDialog()的调用:

PdfReader form = new PdfReader(1);
this.Close();
form.ShowDialog();

或:

PdfReader form = new PdfReader(1);
form.Show();
this.Close();

并将ShutdownMode="OnLastWindowClose"设置为您应用的App.xaml文件:

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml"
    ShutdownMode="OnLastWindowClose"
    >
</Application>

您的代码是:

PdfReader form = new PdfReader(1);
form.ShowDialog();
this.Close();

这意味着CLR执行模态您的新PdfReader窗口。也就是说,程序的执行进入PdfReader窗口。只有关闭 PdfReader窗口后,CLR会执行下一行:

this.Close();

,您的MainWindow()将会关闭。

答案 2 :(得分:1)

如果您阅读https://github.com/sstephenson/execjs,您会看到ShowDialog仅在所述窗口关闭时返回。这意味着您的代码将在该行上被阻止,直到窗口关闭。您必须先关闭当前窗口,然后ShowDialog

    private void BtnIntroClick(object sender, RoutedEventArgs e)
    {
        PdfReader form = new PdfReader(1);
        this.Close();
        form.ShowDialog();

    }

请注意,Show不能以这种方式运作。

答案 3 :(得分:0)

您需要更改this.Close();&amp;之间的顺序form.ShowDialog();它会很好用

试试这段代码:

private void BtnIntroClick(object sender, RoutedEventArgs e)
{

  PdfReader form = new PdfReader(1);
  this.Close();
  form.ShowDialog();
 }

答案 4 :(得分:0)

我们在处理Windows闭包和其他UI操作时需要牢记的重要细节:我们只需要在UI线程中执行它。 这正是我的情况。

我从服务器引发了一个事件,当它发生时我通过自定义 Event Aggregator 引发了另一个事件来关闭打开的第二个窗口(不关闭应用程序)。 然而,如果没有错误或明显的原因,它就不会发生。我的窗户还在打开。 然而,当我通过visual studio设置启用“Common Language Runtime exception”时:

enter image description here

我发现了异常:“完全异常:System.InvalidOperationException:调用线程无法访问此对象,因为另一个线程拥有它。    在System.Windows.Threading.Dispatcher.VerifyAccess()    在System.Windows.Window.Close()..........

因此,而不是:

  ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<ServerDisconnectedEvent>()
         .Subscribe(e => Close());

运行:

        ServiceLocator.Current.GetInstance<IEventAggregator>().GetEvent<ServerDisconnectedEvent>()
            .Subscribe(e => Application.Current.Dispatcher.BeginInvoke(new Action(Close)));

我希望这对像我这样的人来说是安全的时间:)。