# DialogHelper 使用指南 ## 文件位置 `src/Utils/DialogHelper.cs` ## 用途 统一处理对话框的 Owner 设置和置顶显示,解决 Navisworks 插件环境中的窗口焦点问题。 ## 核心方法 ### 1. SetOwnerSafely - 安全设置Owner(推荐) ```csharp // 场景:在 ViewModel 中创建对话框 var dialog = new MyDialog(); DialogHelper.SetOwnerSafely(dialog); dialog.Show(); // 或 dialog.ShowDialog(); ``` **特点**: - 自动查找可用的 Owner 窗口 - 处理 Navisworks 插件环境的特殊情况 - 捕获异常,不会导致程序崩溃 ### 2. ShowDialog - 显示模态对话框(完整处理) ```csharp // 场景:显示需要返回结果的模态对话框 var dialog = new MyInputDialog(); bool? result = DialogHelper.ShowDialog(dialog); ``` ### 3. ShowMessageBox - 显示消息框 ```csharp // 场景:显示错误提示或确认对话框 DialogHelper.ShowMessageBox( "操作成功完成", "提示", MessageBoxButton.OK, MessageBoxImage.Information ); ``` ### 4. SetWin32Owner - 强制置顶到Navisworks主窗口 ```csharp // 场景:对话框必须置顶到Navisworks主窗口(极少数情况) var dialog = new MyDialog(); DialogHelper.SetWin32Owner(dialog); dialog.Show(); ``` ## 使用示例 ### 示例1:ViewModel中显示非模态对话框 ```csharp private MyDialog _myDialog; private void ShowMyDialog() { if (_myDialog != null && _myDialog.IsVisible) { _myDialog.Activate(); return; } _myDialog = new MyDialog(); DialogHelper.SetOwnerSafely(_myDialog); // ✅ 使用工具方法 _myDialog.Show(); _myDialog.Closed += (s, e) => _myDialog = null; } ``` ### 示例2:显示确认对话框 ```csharp private bool ConfirmDelete() { var result = DialogHelper.ShowMessageBox( "确定要删除此路径吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Warning ); return result == MessageBoxResult.Yes; } ``` ## 注意事项 1. **不要在构造函数中设置 Owner**: ```csharp // ❌ 错误 public MyDialog() { InitializeComponent(); this.Owner = Application.Current.MainWindow; // 可能抛出异常 } // ✅ 正确:在外部设置 var dialog = new MyDialog(); DialogHelper.SetOwnerSafely(dialog); ``` 2. **非模态对话框也需要设置 Owner**: ```csharp // 即使是 Show() 而非 ShowDialog(),也需要设置 Owner var dialog = new MyDialog(); DialogHelper.SetOwnerSafely(dialog); // 确保正确置顶 dialog.Show(); ``` 3. **XAML 中不要设置 Owner**: ```xml ```