[英]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.