前言
在WPF中,ShowDialog()
和 Show()
是两种不同的方法用于显示窗口,它们有以下区别:
ShowDialog() 方法:
ShowDialog()
方法用于显示一个模态窗口,也就是说,它会阻塞调用代码,直到显示的窗口关闭为止。- 调用
ShowDialog()
方法后,程序的执行会暂停在此处,直到用户关闭了模态对话框并返回一个指定的结果(例如DialogResult
)。 - 使用
ShowDialog()
方法时,可以通过设置窗口的DialogResult
属性来指定窗口关闭时返回的结果。
1 | var result = dialog.ShowDialog(); |
Show() 方法:
Show()
方法用于显示一个非模态窗口,也就是说,调用 Show()
后,窗口会以非阻塞的方式显示,允许用户同时与应用程序中的其他窗口或控件交互。
调用 Show()
方法后,程序会继续执行后续代码,不会等待窗口的关闭。
1 | dialog.Show(); |
窗口所有权(Owner)的设置:
- 在使用
ShowDialog()
方法显示窗口时,通常会设置一个父窗口作为该窗口的 Owner。这样可以确保模态窗口与其 Owner 之间有逻辑上的层次关系。 - 使用
Show()
方法显示窗口时,也可以手动设置 Owner,但这不是必须的,窗口可以独立显示而没有 Owner。
返回值:
ShowDialog()
方法返回一个bool?
类型的值,表示窗口的DialogResult
。这个值通常用于确定用户关闭窗口时的操作结果。
Show()
方法没有返回值,因为它不会阻塞调用代码,而是立即返回并允许用户与应用程序的其他部分进行交互。
总结来说,选择使用 ShowDialog()
还是 Show()
取决于你的需求:
如果需要一个模态对话框,阻塞用户与应用程序其他部分的交互直到窗口关闭,就使用 ShowDialog()
;
如果希望窗口以非模态方式显示,并允许用户在显示窗口的同时继续操作应用程序的其他部分,就使用 Show()
。
ShowDialog窗口关闭
在WPF中,使用 ShowDialog()
方法显示的窗口可以通过以下几种方式关闭:
关闭窗口并返回结果:
当调用 ShowDialog()
方法显示窗口后,可以通过设置窗口的 DialogResult
属性来指定窗口的返回结果。
例如,可以设置为 true
表示窗口操作成功,或者其他自定义值。
使用 Close()
方法来关闭窗口,此时 ShowDialog()
方法会返回对应的 DialogResult
值。
1 | // 在对话框窗口中设置 DialogResult,并关闭窗口 |
取消或关闭窗口:
如果窗口的操作取消或者不需要返回特定结果,可以直接调用窗口的 Close()
方法来关闭窗口。
1 | // 直接关闭窗口 |
处理窗口关闭事件:
在对话框窗口中,可以通过处理 Closing
事件来执行特定的操作(例如验证或取消关闭操作)。
1 | // 处理窗口关闭事件 |
总结来说,使用 ShowDialog()
方法显示的窗口在关闭时通常会设置 DialogResult
属性来返回结果,然后调用 Close()
方法关闭窗口。
另外,可以通过处理 Closing
事件来添加额外的关闭逻辑。
ShowDialog后代码不执行
在WPF中,当你使用 ShowDialog()
方法显示一个窗口时,显示的窗口会阻塞调用代码的执行,直到该窗口被关闭为止。
这是因为 ShowDialog()
方法创建了一个模态对话框,它会把焦点和交互限制在当前窗口上,直到用户关闭该窗口为止。
如果想让窗口打开后延迟关闭可以这样做
1 | public static void ShowAsDialogDelayClose(string message, double sec) |
自定义消息提示框
1 | <Window |
窗口样式
1 | <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> |
C#代码
1 | using System.Threading.Tasks; |
调用
消息显示手动关闭
1 | MessageWindow.ShowAsDialog("上传成功"); |
消息显示后关闭
1 | MessageWindow.ShowAsDialogDelayClose("发送资源成功", 1.5); |
根据结果处理
1 | if (MessageWindow.ShowWithResult("确定要关闭页面?", "提示") == MessageBoxResult.OK) |