페이지 배경색 기본 표시를 White → Control 로 (레거시 PropertyGrid 와 일치)

페이지 루트에 BackColor 가 없을 때 내가 임의로 'White' 를 지어내 보여 주고 있었다.
페이지 루트는 WinForms UserControl 이고 그 BackColor 기본값은 SystemColors.Control 이라
레거시 PropertyGrid 는 'Control' 을 표시한다 — 사용자가 짚은 그대로다.

근거를 위해 --db-pageprops 진단을 신설해 전수 집계했다(디자인 1,271건 / 페이지 1,816장).

  BackColor  White 1,487장(81.9%) · (없음) 230장(12.7%) · Window 91장(5.0%)
             ButtonHighlight/ControlLightLight/MenuBar/Control/ControlLight 8장
  Font       (없음) 95.6% — 없을 때 굴림 9pt 로 보이는 현행 기본값이 맞다
  기타 키     Margin 9장, BorderStyle 6장, DoNotPrintThisPage 2장 …

12.7% 는 예외가 아니라 흔한 경우다. 표시만 고치고 저장은 하지 않는다 — 지어낸 값이 XML 에
새로 생기면 왕복 diff 0 이 조용히 깨진다. 이 규약을 두 겹으로 못 박았다.
- 편집 스모크: 값 없는 페이지에서 Control 표시 / 미저장 / 용지는 흰색
- --db-pageprops: BackColor 없는 실제 서식 40건을 열어 XML 이 그대로인지 대조

렌더는 흰색을 유지한다. 사용자 확인 결과 레거시 실행 시에도 흰색으로 나오고,
#F0F0F0 종이는 라이트 테마 캔버스 배경(#D8D8D8)과 1.13:1 이라 용지 경계가 사라진다.
대신 값이 없을 때는 라벨 툴팁으로 '저장된 값 없음 / 실행·인쇄는 흰색 / 바꾸면 그때 저장'을
알린다 — 안 그러면 "Control 인데 왜 희게 보이지?" 로 다시 읽힌다.

부수: PropertyRowViewModel 에 Hint 를 추가하고 색상 행 라벨 툴팁에 배선.

회귀: 테스트 124/124, 편집 스모크 실패 0, DB 왕복 1,271건 diff 0/예외 0,
종이 렌더 P062 바이트 동일.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Msystech
2026-08-13 10:44:52 +09:00
co-authored by Claude Opus 5
parent 38093691ad
commit ac36f93a03
6 changed files with 180 additions and 5 deletions
@@ -287,6 +287,12 @@ public sealed class InspectorViewModel : ViewModelBase
/// 저장 시 <c>Size</c>·<c>Name</c> 은 writer 가 Bounds·Id 에서 다시 만들어 덮으므로
/// 그 두 키는 raw 로 편집하게 두면 안 된다 — 고쳐도 저장하면 되돌아간다.
/// </summary>
/// <summary>
/// 페이지 배경색 기본값 — WinForms UserControl 의 BackColor 기본값(SystemColors.Control).
/// 레거시 PropertyGrid 가 속성 없는 페이지에 표시하는 값과 같다.
/// </summary>
private const string DefaultPageBackColor = "Control";
private void BuildPageRows(PageViewModel page)
{
var root = page.Model.Root;
@@ -297,9 +303,23 @@ public sealed class InspectorViewModel : ViewModelBase
"너비", () => page.Model.Width, w => page.Model.Width = Math.Max(1, Math.Round(w)),
"높이", () => page.Model.Height, h => page.Model.Height = Math.Max(1, Math.Round(h)));
AddPageRow(page, new ColorRowViewModel("배경색"),
() => root.Props.GetText("BackColor") ?? "White",
value => root.Props.SetText("BackColor", value.Length == 0 ? "White" : value),
// 속성이 없을 때 보여줄 값은 'White' 가 아니라 'Control' 이다.
// 페이지 루트는 WinForms UserControl 이고 BackColor 기본값은 SystemColors.Control 이라
// 레거시 PropertyGrid 가 그렇게 표시한다. 운영 페이지 1,816장 중 230장(12.7%)이
// 이 키를 갖고 있지 않으므로 적은 사례도 아니다.
// 값을 지어내 표시하기만 하고 저장하지는 않는다 — 손대지 않은 페이지의 XML 은 그대로여야
// 왕복 diff 0 이 유지된다(편집하면 그때 기록된다).
var backRow = new ColorRowViewModel("배경색");
if (root.Props.GetText("BackColor") is null)
{
// 값이 없다는 사실과, 그래도 화면·인쇄는 흰색이라는 것을 함께 알린다 —
// 안 그러면 "Control 인데 왜 희게 보이지?" 로 읽힌다
backRow.Hint = $"배경색 — 저장된 값 없음. 레거시 기본값({DefaultPageBackColor})으로 표시하며, "
+ "실행·인쇄는 흰색입니다. 여기서 바꾸면 그때 저장됩니다.";
}
AddPageRow(page, backRow,
() => root.Props.GetText("BackColor") ?? DefaultPageBackColor,
value => root.Props.SetText("BackColor", value.Length == 0 ? DefaultPageBackColor : value),
page.NotifyPaperChanged);
// 페이지 글꼴은 자식이 상속한다 — 여기를 바꾸면 Font 를 명시하지 않은 컨트롤이 전부 따라온다
@@ -18,6 +18,15 @@ public abstract class PropertyRowViewModel : ViewModelBase
/// <summary>행 라벨(한글)</summary>
public string Label { get; }
/// <summary>
/// 라벨에 붙일 설명 — 값만으로는 오해할 수 있는 행에 쓴다.
/// (예: 저장된 값이 없어 기본값을 보여 주는 중이라는 사실)
/// </summary>
public string? Hint { get; set; }
/// <summary>라벨 툴팁 — 설명이 있으면 그것, 없으면 라벨 자신(잘림 대비)</summary>
public string LabelToolTip => Hint ?? Label;
/// <summary>선택 대상들의 값이 서로 다른지 — "여러 값" 표시</summary>
public bool IsMixed { get; private set; }