# 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
   <!-- ❌ 错误 -->
   <Window ...
       Owner="{x:Static Application.Current.MainWindow}">
   
   <!-- ✅ 正确：XAML中不设置，代码中设置 -->
   <Window ...>
   ```
