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