소스(Core/Shell/Launcher)와 실행 PC가 받아갈 업데이트 파일(dist)을 함께 올린다. Launcher가 켤 때 이 저장소의 dist와 D:\UbisamPlatform\bin을 비교해 새 버전이면 받아간다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
3.4 KiB
Markdown
66 lines
3.4 KiB
Markdown
# 패치 09 — MessageBox를 테마 적용 대화상자로
|
|
|
|
WPF의 `MessageBox`는 OS 크롬이라 스타일을 입힐 수 없습니다. 다크모드에서 혼자 밝은 창이 뜨는 이유입니다. 같은 모양의 커스텀 창으로 대체합니다.
|
|
|
|
**`MessageUtil`의 시그니처는 그대로입니다** — `ShowInfo`, `ShowError`, `ShowYesNo`, `ShowSaveSuccessDialog`, `ShowSaveFailedDialog`, Toast 5종 전부 동일합니다. 호출하는 쪽은 한 줄도 고칠 필요가 없습니다.
|
|
|
|
## 모양
|
|
|
|
- OS 타이틀바 없음(`WindowStyle="None"`) — 제목줄을 직접 그리고 드래그로 옮길 수 있음
|
|
- 폭 420 고정, 높이는 내용에 맞춰 자동
|
|
- 셸과 같은 3단 구성: 제목줄(판) / 본문(바탕) / 버튼줄(판), 사이는 1px 헤어라인
|
|
- 본문은 아이콘 24px + 메시지, 아이콘은 상단 정렬(메시지가 길어도 위에 고정)
|
|
- 버튼은 우측 하단. 확인/예가 주 동작(`Accent.Fill` 채움), 아니오가 보조(외곽선)
|
|
- 아이콘: 알림 `circle-info`, 오류 `circle-x`(붉은색), 확인 `circle-help`
|
|
- Enter = 확인, Esc = 취소
|
|
|
|
## 1. 새 파일 3개
|
|
|
|
| 이 프로젝트 | 리포지토리 |
|
|
| --- | --- |
|
|
| `code/UbisamBase.Core/Messaging/MessageDialog.xaml` | `src/UbisamBase.Core/Messaging/MessageDialog.xaml` (신규) |
|
|
| `code/UbisamBase.Core/Messaging/MessageDialog.xaml.cs` | `src/UbisamBase.Core/Messaging/MessageDialog.xaml.cs` (신규) |
|
|
| `code/UbisamBase.Core/Messaging/MessageUtil.cs` | `src/UbisamBase.Core/Messaging/MessageUtil.cs` (교체) |
|
|
|
|
## 2. 갱신 파일 3개
|
|
|
|
| 파일 | 변경 |
|
|
| --- | --- |
|
|
| `Themes/Icons.xaml` | 아이콘 3종 추가 — `Ubisam.Icon.Info` / `.Question` / `.Error` |
|
|
| `Themes/Colors.Light.xaml` | 오류색 토큰 2개 — `Danger` #C93B3B / `Danger.Fill` #B32F2F |
|
|
| `Themes/Colors.Dark.xaml` | 오류색 토큰 2개 — `Danger` #F07070 / `Danger.Fill` #B33A3A |
|
|
|
|
붉은색은 대화상자 아이콘과 실패 표시에만 씁니다 — 장식용 색을 늘리지 않는 것이 이 시스템의 규칙입니다.
|
|
|
|
## 3. 쓰는 법 (변화 없음)
|
|
|
|
```csharp
|
|
MessageUtil.ShowInfo("저장", "저장되었습니다.");
|
|
MessageUtil.ShowError("저장 실패", "저장하지 못했습니다.");
|
|
|
|
if (MessageUtil.ShowYesNo("확인", "저장하지 않은 변경 사항이 있습니다.\n그래도 나가시겠습니까?"))
|
|
{
|
|
// 예를 눌렀을 때
|
|
}
|
|
|
|
MessageUtil.ShowSavedToast(logger);
|
|
```
|
|
|
|
여러 줄 메시지는 `\n`을 그대로 쓰면 됩니다 — `TextWrapping="Wrap"`이라 폭을 넘기면 자동으로도 접힙니다.
|
|
|
|
## 4. 확인
|
|
|
|
1. `저장` 버튼을 눌러 대화상자가 뜰 때 OS 타이틀바가 없고 셸과 같은 각진 프레임인지
|
|
2. 다크 테마에서 대화상자도 어두운지 (밝은 창이 뜨면 파일이 교체되지 않은 것)
|
|
3. 제목줄을 끌어 창이 움직이는지
|
|
4. Enter로 확인, Esc로 취소가 되는지
|
|
5. 오류 대화상자의 아이콘만 붉은색이고, 버튼은 accent인지
|
|
6. 확인(YesNo) 대화상자에서 "아니오"가 보이고 false를 돌려주는지
|
|
7. 부모 창 가운데에 뜨는지
|
|
|
|
## 주의
|
|
|
|
- `MessageDialog`는 `ShellStyles.xaml`을 자체 `Window.Resources`에 머지합니다 — 별도 창이라 셸의 리소스를 상속받지 못하기 때문입니다. 이 줄을 지우면 스타일이 빠집니다.
|
|
- 작업 표시줄에 안 뜨게 `ShowInTaskbar="False"`로 두었습니다.
|
|
- 부팅 초기(`MainWindow`가 아직 로드되지 않은 시점)에 호출하면 화면 가운데에 뜹니다.
|