对话框DialogBox
一、WPF 中的对话框是什么?
对话框 = 弹出并阻塞主窗口,用户必须处理完才能继续操作主界面的窗口。
WPF 里对话框分两类:
- 系统对话框(MessageBox、OpenFileDialog、SaveFileDialog、FolderBrowserDialog 等)
- 自定义对话框(自己用 Window 做的模态窗口)
核心特点:
- 调用
ShowDialog()打开 → 模态阻塞 - 会返回
bool?结果(true/false/null) - 关闭前无法操作父窗口
- 常用于:确认、提示、选择文件、设置、登录等
二、最基础:MessageBox 消息对话框
最简单、最常用的系统对话框。
1. 基本用法
1 MessageBox.Show("这是一条提示信息");
2. 带标题
1 MessageBox.Show("操作成功", "提示");
3. 带按钮(确认 / 取消)
1 MessageBoxResult result = MessageBox.Show( 2 "确定要删除吗?", 3 "确认", 4 MessageBoxButton.YesNo 5 ); 6 7 if (result == MessageBoxResult.Yes) 8 { 9 // 删除逻辑 10 }
4. 带图标
1 MessageBox.Show( 2 "保存失败,请重试", 3 "错误", 4 MessageBoxButton.OK, 5 MessageBoxImage.Error 6 );
5. 常用枚举
-
MessageBoxButton
- OK
- OKCancel
- YesNo
- YesNoCancel
-
MessageBoxImage
- None
- Error
- Warning
- Info
- Question
三、系统通用对话框(文件 / 文件夹)
WPF 封装了 Windows 原生对话框,需要引用:
1 using Microsoft.Win32;
1. 打开文件对话框 OpenFileDialog
1 var dlg = new OpenFileDialog(); 2 dlg.Title = "选择文件"; 3 dlg.Filter = "文本文件|*.txt|所有文件|*.*"; 4 dlg.Multiselect = false; 5 6 if (dlg.ShowDialog() == true) 7 { 8 string path = dlg.FileName; 9 }
2. 保存文件对话框 SaveFileDialog
1 var dlg = new SaveFileDialog(); 2 dlg.Filter = "文本文件|*.txt"; 3 dlg.FileName = "文档.txt"; 4 5 if (dlg.ShowDialog() == true) 6 { 7 string path = dlg.FileName; 8 }
3. 文件夹浏览对话框(FolderBrowserDialog)
.NET Framework 直接用
1 var dlg = new FolderBrowserDialog(); 2 if (dlg.ShowDialog() == true) 3 { 4 string path = dlg.SelectedPath; 5 }
四、WPF 核心:自定义对话框(最重要)
自定义对话框 = 一个普通 Window + 调用 ShowDialog ()
这是企业开发最常用的形式。
规则
- 对话框窗口本质就是 Window
- 打开用
ShowDialog(),不是 Show () - 关闭时设置
DialogResult = true/false来返回结果 - 可以在对话框里放任何 WPF 控件(输入框、表格、按钮)
五、完整示例:自定义登录对话框
步骤 1:创建对话框窗口 LoginWindow.xaml
1 <Window x:Class="WpfDialogDemo.LoginWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="登录" 5 Width="300" Height="200" 6 ResizeMode="NoResize" 7 WindowStartupLocation="CenterOwner"> 8 9 <Grid Margin="10"> 10 <StackPanel VerticalAlignment="Center"> 11 <TextBox x:Name="txtAccount" PlaceholderText="账号" Margin="0 0 0 5"/> 12 <PasswordBox x:Name="txtPwd" PlaceholderText="密码" Margin="0 0 0 10"/> 13 14 <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> 15 <Button Content="取消" Click="BtnCancel_Click" Width="70" Margin="5"/> 16 <Button Content="确定" Click="BtnOk_Click" Width="70" Margin="5"/> 17 </StackPanel> 18 </StackPanel> 19 </Grid> 20 </Window>
步骤 2:后台 LoginWindow.xaml.cs
1 public partial class LoginWindow : Window 2 { 3 // 对外暴露输入结果 4 public string Account => txtAccount.Text; 5 public string Pwd => txtPwd.Password; 6 7 public LoginWindow() 8 { 9 InitializeComponent(); 10 } 11 12 private void BtnOk_Click(object sender, RoutedEventArgs e) 13 { 14 // 返回 true 表示确认 15 DialogResult = true; 16 } 17 18 private void BtnCancel_Click(object sender, RoutedEventArgs e) 19 { 20 // 返回 false 表示取消 21 DialogResult = false; 22 } 23 }
步骤 3:主窗口调用(模态打开)
1 private void ShowLoginDialog() 2 { 3 var dlg = new LoginWindow(); 4 dlg.Owner = this; // 固定在父窗口上居中 5 6 bool? result = dlg.ShowDialog(); 7 8 if (result == true) 9 { 10 string account = dlg.Account; 11 string pwd = dlg.Pwd; 12 // 登录逻辑 13 } 14 else 15 { 16 // 用户取消 17 } 18 }
六、对话框关键机制(必须理解)
1. ShowDialog () 做了什么?
- 阻塞当前线程
- 禁用父窗口
- 直到对话框关闭才继续执行后面代码
- 返回
bool?:true / false / null
2. DialogResult 的作用
- 设置
DialogResult = true→ 自动关闭窗口并返回 true - 设置
DialogResult = false→ 返回 false - 直接关闭(点右上角)→ 返回 null
3. Owner 属性(非常重要)
1 dlg.Owner = this;
作用:
- 对话框永远在父窗口上方
- 一起最小化 / 还原
- 居中以父窗口为基准
4. 对话框常用样式设置
1 ResizeMode="NoResize" <!-- 禁止拖动大小 --> 2 WindowStyle="SingleBorderWindow" 3 ShowInTaskbar="False" <!-- 不在任务栏显示 --> 4 WindowStartupLocation="CenterOwner"
七、进阶:带返回数据的对话框
对话框不仅返回是否确认,还能返回复杂对象。
示例:
1 public class UserInfo 2 { 3 public string Name { get; set; } 4 public int Age { get; set; } 5 } 6 7 // 对话框内部 8 public UserInfo ResultInfo { get; set; } 9 10 private void BtnOk_Click(...) 11 { 12 ResultInfo = new UserInfo { Name = txtName.Text, Age = 18 }; 13 DialogResult = true; 14 }
调用:
1 var dlg = new InputWindow(); 2 if (dlg.ShowDialog() == true) 3 { 4 UserInfo info = dlg.ResultInfo; 5 }
八、模态 vs 非模态(核心区别)
| 方式 | 方法 | 特点 |
|---|---|---|
| 非模态 | Show() | 不阻塞,可切换窗口 |
| 模态 | ShowDialog() | 阻塞,必须关闭才能操作父窗口 |
对话框一定用 ShowDialog ()
九、总结(最精炼)
- MessageBox:简单提示、确认
- OpenFileDialog/SaveFileDialog:系统文件选择
- 自定义对话框 = Window + ShowDialog (),企业开发主流
- 对话框通过 DialogResult 返回成功 / 取消
- Owner 必须设置,保证窗口行为正确
- 适合:登录、设置、编辑、选择器、向导步骤
浙公网安备 33010602011771号