From 9e3cd088e239219586a75100a3d3a2bca727e25e Mon Sep 17 00:00:00 2001 From: Msystech Date: Tue, 18 Aug 2026 09:42:19 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=EA=B0=80?= =?UTF-8?q?=20=ED=8E=B8=EC=A7=91=EC=9D=84=20=EB=94=B0=EB=9D=BC=EC=98=A4?= =?UTF-8?q?=EA=B3=A0,=20=EC=B0=BD=EC=9D=B4=20=ED=95=98=EB=82=98=EB=A7=8C?= =?UTF-8?q?=20=EB=9C=AC=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 미리보기 레거시 호환 계획의 P0-2. 환자 값이 들어가기 전에 반드시 고쳐야 하는 항목이다. ① 창이 여러 장 쌓였다. 모덜리스인데 누를 때마다 새로 만들어서, 각각이 서로 다른 시점의 서식을 들고 겹쳐 있었고 어느 것이 지금 것인지 화면으로 구분할 수 없었다. 환자 데이터가 들어가면 그건 개인정보 사고가 된다 — 환자를 B 로 바꿔도 옛 창이 A 를 계속 띄운다. 이제 하나만 뜨고, 이미 있으면 지금 문서로 갈아타 앞으로 온다. ② 생성자에서 한 번만 그렸다. 컨트롤을 추가·삭제하거나 숨김·인쇄출력을 토글해도 창은 옛 그림을 계속 보여 줬다 — 저장 전에 결과를 확인하려고 여는 창이 구조적으로 거짓말을 하고 있었다. 페이지·컨트롤 추가/삭제는 즉시(CollectionChanged), 그 밖의 변경은 창을 누르는 순간(Activated) 다시 그린다. 즉시 갱신이 안 되는 변경이 남아 있으므로 새로 고침 버튼도 함께 뒀다 — 자동에 기대게 하지 않는다. 제목에 서식명을 넣는다. 창이 하나뿐이라 무엇을 보고 있는지 제목이 말해야 한다. 같은 함정에 세 번째로 걸렸다. 단정이 52 → 41 로 나왔다 — 재빌드는 됐는데 새 자식이 아직 실체화되지 않아 요소 수가 오히려 줄어 보인 것이다. UpdateLayout 을 돌리고 세니 통과했다. WPF 시각 트리를 세는 검사는 반드시 레이아웃을 먼저 돌려야 한다. 진단(--dialog-shots)은 생성자를 직접 부른다 — 단일 인스턴스 등록을 건너뛰어야 샷마다 새 창을 찍을 수 있다. 앱 코드는 ShowFor 만 쓴다는 것을 주석에 못 박았다. 게이트: 테스트 298/298, --edit-smoke 0실패(신규 1), --dialog-shots 글자 2,651개 FAIL 0 대조군 4/4, --modal-check 0실패, --cleartype 11/11, --maxrect 0실패, --scale-budget 5/5, 빌드 경고 0, --db-smoke 1271건 diff 0, --db-render P062 md5 8d683835f5d81e7bb41c79071d6bf954 동일. Co-Authored-By: Claude Opus 5 --- src/SheetMe.Designer/Diagnostics/EditSmoke.cs | 24 ++++ .../ViewModels/MainViewModel.cs | 7 +- src/SheetMe.Designer/Views/PreviewWindow.xaml | 2 + .../Views/PreviewWindow.xaml.cs | 108 +++++++++++++++++- 4 files changed, 133 insertions(+), 8 deletions(-) diff --git a/src/SheetMe.Designer/Diagnostics/EditSmoke.cs b/src/SheetMe.Designer/Diagnostics/EditSmoke.cs index dab4990..3306400 100644 --- a/src/SheetMe.Designer/Diagnostics/EditSmoke.cs +++ b/src/SheetMe.Designer/Diagnostics/EditSmoke.cs @@ -340,6 +340,30 @@ public static class EditSmoke // 인쇄 필터가 캔버스로 새면 안 된다 — 편집 중인 것을 못 보면 고칠 수 없다 Check("미리보기: 캔버스는 자식을 그대로 다 보여 준다", boxedPanel.Children.Count == 3, $"{boxedPanel.Children.Count} (기대 3)"); + + // 창이 편집을 따라오는가. + // 전에는 생성자에서 한 번만 그려서, 컨트롤을 추가·삭제해도 옛 그림을 계속 보여 줬다 — + // 저장 전에 결과를 확인하려고 여는 창이 구조적으로 거짓말을 하고 있었다. + var live = new Views.PreviewWindow(boxedVm) + { + Left = -10000, Top = -10000, + WindowStartupLocation = WindowStartupLocation.Manual, + ShowActivated = false, ShowInTaskbar = false, + }; + live.Show(); + // 레이아웃을 돌리고 센다 — 재빌드 직후에는 새 자식이 아직 실체화되지 않아 + // 요소 수가 오히려 줄어 보인다(실제로 52 → 41 로 걸렸다). 세 번째 같은 함정이다. + int Pages() + { + live.UpdateLayout(); + return CountVisuals(live); + } + var livePages = Pages(); + boxedVm.AddControlAt("Label", new Point(300, 400)); + var liveAfterAdd = Pages(); + Check("미리보기: 컨트롤을 추가하면 창이 따라온다", liveAfterAdd > livePages, + $"요소 {livePages} → {liveAfterAdd} (안 늘면 생성자에서 한 번만 그린 것)"); + live.Close(); } // 2) 클릭 선택 — 컨트롤 중심(핸들 반경 밖) diff --git a/src/SheetMe.Designer/ViewModels/MainViewModel.cs b/src/SheetMe.Designer/ViewModels/MainViewModel.cs index e4c60f8..faf7696 100644 --- a/src/SheetMe.Designer/ViewModels/MainViewModel.cs +++ b/src/SheetMe.Designer/ViewModels/MainViewModel.cs @@ -970,10 +970,9 @@ internal sealed class MainViewModel : ViewModelBase { return; } - new Views.PreviewWindow(CurrentDesigner) - { - Owner = Application.Current.MainWindow, - }.Show(); + // 창은 하나만 뜬다 — 여러 장이 겹치면 각각 다른 시점의 서식을 들고 있게 되고, + // 환자 데이터가 들어가면 옛 창이 옛 환자를 계속 띄운다. + Views.PreviewWindow.ShowFor(CurrentDesigner, Application.Current.MainWindow); } private void OnPrint() diff --git a/src/SheetMe.Designer/Views/PreviewWindow.xaml b/src/SheetMe.Designer/Views/PreviewWindow.xaml index cd90969..d17d2c2 100644 --- a/src/SheetMe.Designer/Views/PreviewWindow.xaml +++ b/src/SheetMe.Designer/Views/PreviewWindow.xaml @@ -8,6 +8,8 @@