在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();
}
}
答案 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
设为OnLastWindowClose
为MSDN 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”时:
我发现了异常:“完全异常: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)));
我希望这对像我这样的人来说是安全的时间:)。