簡體   English   中英

this.Close(); 在窗口wpf中不起作用

[英]this.Close(); doesn't work in window 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();

        }
 }

當您關閉PdfReader form時它將關閉。 Form.ShowDialog僅在表單關閉時返回。 所以在ShowDialog完成之前不會調用this.Close()
你可以做的是在調用form.ShowDialog();之前設置this.Visibility = Visibility.Hidden form.ShowDialog();

當我們處理Windows閉包和其他UI操作時,我們需要記住的重要細節: 我們只需要在UI線程中執行它 這正是我的情況。

我從服務器引發了一個事件,當它發生時,我通過自定義Event Aggregator引發另一個事件來關閉打開的第二個窗口(不關閉應用程序)。 然而,如果沒有錯誤或明顯的原因,它就不會發生。 我的窗戶還在打開。 然而,當我通過visual studio設置啟用“Common Language Runtime exception”時:

在此輸入圖像描述

我發現異常:“ 完全異常:System.InvalidOperationException:調用線程無法訪問此對象,因為另一個線程擁有它。在System.Windows.Window.Close()的System.Windows.Threading.Dispatcher.VerifyAccess()。 .........

因此,而不是:

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

運行這個:

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

我希望這對像我這樣的人來說是安全的時間:)

當您使用Window.ShowDialog() ,它以模態方式調用新窗口,這意味着您無法轉到父窗體。

Window.Show()函數以非模態形式顯示表單。 這意味着您可以單擊父窗體。

但是,此代碼將關閉您的應用程序,如MSDN所說 (感謝@Empereur Aiman):

OnMainWindowClose的ShutdownMode導致Windows Presentation Foundation(WPF)在MainWindow關閉時隱式調用Shutdown, 即使其他窗口當前處於打開狀態

你應該將你的ShutdownMode設置為OnLastWindowClose因為MSDN說

如果將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();

並在應用程序的App.xaml文件中設置ShutdownMode="OnLastWindowClose"

<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()將被關閉。

如果您閱讀此MSDN文章,您將看到ShowDialog僅在所述窗口關閉時返回。 這意味着您的代碼將在該行上被阻止,直到窗口關閉。 您必須先關閉當前窗口,然后關閉ShowDialog

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

    }

請注意, Show不會以這種方式工作。

你需要改變this.Close(); form.ShowDialog(); 它會運作良好

試試這段代碼:

private void BtnIntroClick(object sender, RoutedEventArgs e)
{

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM