对话框DialogBox

一、WPF 中的对话框是什么?

对话框 = 弹出并阻塞主窗口,用户必须处理完才能继续操作主界面的窗口。
 
WPF 里对话框分两类:
  1. 系统对话框(MessageBox、OpenFileDialog、SaveFileDialog、FolderBrowserDialog 等)
  2. 自定义对话框(自己用 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 ()
 
这是企业开发最常用的形式。

规则

  1. 对话框窗口本质就是 Window
  2. 打开用 ShowDialog(),不是 Show ()
  3. 关闭时设置 DialogResult = true/false 来返回结果
  4. 可以在对话框里放任何 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 ()

九、总结(最精炼)

  1. MessageBox:简单提示、确认
  2. OpenFileDialog/SaveFileDialog:系统文件选择
  3. 自定义对话框 = Window + ShowDialog (),企业开发主流
  4. 对话框通过 DialogResult 返回成功 / 取消
  5. Owner 必须设置,保证窗口行为正确
  6. 适合:登录、设置、编辑、选择器、向导步骤
posted on 2026-03-27 14:23  工业搬砖猿Lee  阅读(22)  评论(0)    收藏  举报