# Modal 对话框

Modal 是模态对话框，适合删除确认、提交确认、错误详情、复杂内容展示等必须等待用户响应的场景。

在 aardio 中推荐使用 `AntdUI.Modal.Config(...)` 创建配置对象，再调用 `AntdUI.Modal.open(cfg)`。静态 Modal 需要 AntdUI 可识别的 owner，通常使用嵌入到 aardio `custom` 控件里的 `AntdUI.BaseForm`。

## 基础确认框

```aardio
import win.ui;
import dotNet;
import dotNet.AntdUI;
import System.Windows.Forms;

var winform = win.form(text="AntdUI Modal";right=640;bottom=360)
winform.add(
customBase={cls="custom";left=0;top=0;right=640;bottom=360;z=1};
btn={cls="button";text="删除";left=40;top=40;right=160;bottom=76;z=2}
)

var baseForm = AntdUI.BaseForm(winform.customBase);

winform.btn.oncommand = function(){
    var cfg = AntdUI.Modal.Config(baseForm,"删除确认","确定删除这条记录吗？",AntdUI.TType.Warn);
    cfg.OkText = "删除";
    cfg.CancelText = "取消";
    cfg.MaskClosable = false;
    cfg.Width = 420;

    var result = AntdUI.Modal.open(cfg);
    if(result == System.Windows.Forms.DialogResult.OK){
        AntdUI.Message.open(AntdUI.Message.Config(baseForm,"已删除",AntdUI.TType.Success));
    }
}

winform.show();
win.loopMessage();
```

## Config 常用字段

- `Title`：标题。
- `Content`：内容，可为字符串、控件、`Modal.TextLine[]` 等对象。
- `Icon`：状态图标，`AntdUI.TType.Success/Info/Warn/Error`。
- `Width`：对话框宽度。
- `Mask` / `MaskClosable`：遮罩与点击遮罩关闭。
- `CloseIcon`：右上角关闭图标。
- `Keyboard`：是否允许 Esc 关闭。
- `OkText` / `CancelText`：确认/取消按钮文字；`CancelText = null` 可隐藏取消按钮。
- `OkType`：确认按钮类型，`AntdUI.TTypeMini.Primary/Warn/Error` 等。
- `DefaultAcceptButton` / `DefaultFocus`：默认按钮与焦点。
- `OnOk`：确认回调，返回 true 表示通过。
- `Btns` / `OnBtns`：自定义按钮数组与按钮回调。
- `Draggable`：是否可拖拽。
- `Resizable` / `MinimumSize` / `MaximumSize`：是否可调整大小与大小限制。

## 多行内容 TextLine[]

如果正文需要分行、局部配色或控制行距，可用 `AntdUI.Modal.TextLine` 数组作为内容。

```aardio
import dotNet;
import dotNet.AntdUI;

var asm = dotNet.load("AntdUI",$"~\lib\dotNet\AntdUI\.res\AntdUI.dll");
var textLineType = asm.getType("AntdUI.Modal+TextLine");
var lines = dotNet.createArray(textLineType,2);

lines.SetValue(AntdUI.Modal.TextLine("即将删除：客户 A"),0);
lines.SetValue(AntdUI.Modal.TextLine("此操作不可恢复",6),1);

var cfg = AntdUI.Modal.Config(baseForm,"危险操作",lines,AntdUI.TType.Error);
cfg.OkText = "确认删除";
cfg.OkType = AntdUI.TTypeMini.Error;
AntdUI.Modal.open(cfg);
```

## 自定义按钮 Btn[]

`Modal.Btn` 可添加除确定/取消外的业务按钮。aardio 中创建 .NET 数组时使用 `dotNet.createArray`，数组下标从 0 开始。

```aardio
import dotNet;
import dotNet.AntdUI;

var asm = dotNet.load("AntdUI",$"~\lib\dotNet\AntdUI\.res\AntdUI.dll");
var btnType = asm.getType("AntdUI.Modal+Btn");
var btns = dotNet.createArray(btnType,2);

btns.SetValue(AntdUI.Modal.Btn("preview","预览",AntdUI.TTypeMini.Info),0);
btns.SetValue(AntdUI.Modal.Btn("delete","强制删除",AntdUI.TTypeMini.Error),1);

var cfg = AntdUI.Modal.Config(baseForm,"选择操作","请选择下一步操作",AntdUI.TType.Warn);
cfg.Btns = btns;
AntdUI.Modal.open(cfg);
```

## 使用控件作为内容

`Content` 也可以是 WinForms/AntdUI 控件。适合在 Modal 中放表单、输入框或列表。

```aardio
import dotNet.AntdUI;
import System.Windows.Forms;
import System.Drawing;

var panel = System.Windows.Forms.Panel();
panel.Size = System.Drawing.Size(360,120);

var label = System.Windows.Forms.Label();
label.Text = "这里可以放置更复杂的 WinForms / AntdUI 内容。";
label.Dock = System.Windows.Forms.DockStyle.Fill;
panel.Controls.Add(label);

var cfg = AntdUI.Modal.Config(baseForm,"复杂内容",panel,AntdUI.TType.Info);
cfg.Width = 480;
AntdUI.Modal.open(cfg);
```

## 注意

- `AntdUI.Modal.open(cfg)` 会返回 `System.Windows.Forms.DialogResult`，可与 `DialogResult.OK/Cancel` 比较。
- 回调与复杂内容涉及 .NET 委托和控件生命周期，建议先用简单配置跑通，再逐步添加业务逻辑。
- 对话框 owner 推荐传 `AntdUI.BaseForm`，不要直接传 aardio `win.form` 或 hwnd。
