From 00b37540635ef77473ead024ce1e217031f65a78 Mon Sep 17 00:00:00 2001 From: choiminyeong Date: Mon, 21 Sep 2026 22:42:14 +0900 Subject: [PATCH] =?UTF-8?q?=EB=9F=B0=EC=B2=98=20=EC=B0=BD=EC=9D=B4=20?= =?UTF-8?q?=EC=95=B1=20=ED=85=8C=EB=A7=88=20=EC=84=A4=EC=A0=95=EC=9D=84=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B4=EB=8F=84=EB=A1=9D=20-=20=EB=8B=A4=ED=81=AC?= =?UTF-8?q?=20=EB=AA=A8=EB=93=9C=EC=97=90=EC=84=9C=20=ED=9D=B0=20=EC=B0=BD?= =?UTF-8?q?=EC=9D=B4=20=EB=9C=A8=EB=8D=98=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5 --- dist/README.txt | 2 +- dist/UbisamBase.Core.dll | Bin 681472 -> 681472 bytes dist/UbisamBase.Launcher.exe | Bin 111104 -> 112128 bytes dist/UbisamBase.Shell.exe | Bin 86528 -> 86528 bytes dist/platform-version.json | 2 +- doc/history/changelog.md | 1 + src/UbisamBase.Launcher/LauncherTheme.cs | 91 ++++++++++++++++++ .../ProgressWindow.xaml.cs | 18 +--- src/UbisamBase.Launcher/UpdateDialog.xaml.cs | 19 +--- 9 files changed, 96 insertions(+), 37 deletions(-) create mode 100644 src/UbisamBase.Launcher/LauncherTheme.cs diff --git a/dist/README.txt b/dist/README.txt index 86810a6..111293e 100644 --- a/dist/README.txt +++ b/dist/README.txt @@ -1,5 +1,5 @@ UbisamBase 플랫폼 배포 폴더 (빌드할 때 자동 생성 - 직접 고치지 마세요) -갱신 시각 : 2026-09-21 22:36:26 +갱신 시각 : 2026-09-21 22:42:14 빌드 구성 : Release 원본 소스 : D:\업무\03_개발\Source\용접기\08_UbisamPlatform\ ---- diff --git a/dist/UbisamBase.Core.dll b/dist/UbisamBase.Core.dll index d2c32e79e2b615e578f0c3dd0e6460712f93a887..a307f8f045e8ea9eaf594b887d369d8da2cc3960 100644 GIT binary patch delta 146 zcmZoTquFpqb3zA;ma_1P#-6P`j5+58;yvz5yMIb_-t%|$*UO8imbY_UU<6_&AZ7+) z79eH?Vm2UV2V#!x92YpB^swxiYrl5-hZwE^f&3ji|5yoBcuuyfTKDtL)1A`;V!3J* fprSirqCoY!ows)WJW;69b3}7x$o4m}Tp}C*_zOg@ delta 146 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 delta 12911 zcmbt*3w%}8neVsP-h1tR_Q^TP-sdENkeCEW*yI7>4FXC;<)sJ()D%P*ACy)-u!GMS zcg`RRDquVg$|wpx2RqbS>?osC@zJriwbhwA)oF=lbjH#atGDg7TFbrvZ|$8!0Pp{yM?^~}EdVVW=K9F~A9)9%P`+h<3=RF!uNv(}&0~j+j#l5P~`^5R8 zx=;{Wqgi$r(b7WwbuEPsZIsi~35_~@HxzEunzd^R|DcW1zFp|khBq!MsLC`Kg&>o@ zHUr3ML~JudB)@h8(ce|VQd41(@U*doOT_6N291UoD(+1QBEwG+IgUpGIP3g0hyYdB z3BMF*t_+~D3Hrm@bkzx<6byxes+@Bnuk7>y{Y>Fvqy8cRyTXTI+1Ks_%b_T9Sr(Tw zkl+Vvip=0)psJzZN5Cp-+x!ZsHTFs0g61#LuvX1264^FQPZbUsm7$InI@=+3r0AZ8 z5y;>-Y-S=@-KT;MrfF!ki_xxDfIFtbOiYhCfgTImuSA=zsaS(K&1P^VZ1_V4`aH;5 z*y0V+RCQaD!L_W;qigcv9H%uI>@9MF*MMg0%0>}+T9$_^AwN`<%T5ehc27scvWsD^ z3MOQ>8~rw9=P(f6m{>y|m1huzvJ)j>_ z!;e~ttBiwMH`>6kcrpgH)Q#q1uA02uB&gaI<8!%Slk%pAc%MKokq4wEePE(~uV5F#Q64F`d+ z7WIID~}PUPlH$)Rsy#DizMXK^&D;6Z4)rn0G4AJ?cW+MIcu zO_==AV3W&FGORZ9%P64K|}t4XQ5c36&iBu?)zf z)1M%9!i!A~W%|2M(6av=CBGZMbC6WlkRItfE1u57hj16kbXj1E=6 zXGKMg$RUaxA4`S9E0xov7Ud?&v>9|3ykzoL)6gm#Z$d&lD%u>W>a_7;l)0aS# zg?-5pp@l9~IJ%E*$Y~V8r%Ddmop^lQ$_8HT@97B zV|V4SVLK^35e1C_Kb#Im#&pdn_iZ4`KH08O>0>}nU%F9NUg-3NR#cLeYX`gau0F?V zkyZ}dg!4-^E)5A!^mR&JO;#CPq3|2Y!oIBu8b-lZa#&*+eA)r2%}Xdcge5d>bi-qY zsl2c__%p^PI%mUjLq+aPE-G^&rh&_|qhbyhJ`N*JZXTn#`GA3LAv~G^atn?z$1?N0 z0cKKCxx80aXV=2}EIP2scu>^uyUnWS| zYO_qlTP9mJatqN^YkAa8?!3aDRCf9zuo@F}Z(xFR3O8jJx41agS`2x`Q7vQiRYjbZ zWGp$O@NsHZ3I`y!^D9ttL~co8X1Z#{Qm!#>x>QG|U^#~FF9R!;$eoX(Wq2ZY0m{nU zg@CyZ0MGEh$`V_5joflzGPeS-vH4z^V`FtcfHTJ4F74b!h5hM<#h6D#u3B(J--45Z z(P^%fDj1ViT@PydD`BHgZ|ox(1y6sUBU_}5f=5*P7Z*mCP6~MpJs6GA#36DB6|rHt z{wlC@s{x!~Jr4zOBNZljSCD;vMh3eeaHG>-@GdKrLO(F=!3RCmss}^Ge$tBat}a*r zmKAIV3aTZvPU1hE}i93J$RiH0*R<3UEV-ox2R>wwAKWt#AuAZa<4& zJ=CmaQ+76yyBxv{GVN+UytE`;<55O3X0xbha?K_TQbV#3l~b4+PP_tZnKqNK=}`%f zehun7a@*RzR2Dvts8aaVfPNLD;;5`c*|{E4KLFq* zT_-H@l!li&vAC$SJ(eLOlzKNZ+`xejJu!se34J6t79QET0eJ4}q5MK@N%V-@EdUoq2W(RS2B=Up6EqL1kEP$hQ_EQg{C@os!ImUYZp?q3VGqqm+S zx-yX5bREcS?s~w8A#*nXZyF?(QRSX*%<{V+@^1v_>;`D)yon*!Q53lz#w&7p#@QTu zMTAs=0K;nS>aA8V0da$K)EpH4Fdif`mq*Op05i$VjS=&n0cHs^zZo%K7+|KD`L7Z4 z!vQAFa^U_s;+BR^+*HP7_6U&Zz?33a3hDnfIx8%HBNtuB55vygtZ>9Uk}S7L5tv#7 zt3gCynpkp+lEC+dmAh5p7^#tnaipvf4iG#et{GQn$H#`7&KCY=RDBdVqjhcphJ{Md zIhaXQac{Z}oL~X^o4XyDBU|-sb5aK1=MmfiPKg~Y0x4Uq0XP~Q)tj}-R9~rD47D=~ zhxAbsPZ9oBHjNpfkuZ%8xS|UQY_w=iqOzN@;4o|s>D{bsdv`UJ}kMKv#4PhscO&O| z8I|zKKxPa9Ud#;41y00qXk&#umKn(LVrF3dEM^A6$#AW>1|q2_;JF&em^$ELG0EWa zqJ*byAmOk!75SJw&M}qGU5b#oD60|k&{DW-`KTkmB=7hXc|zvR`2R>fm3iSn=1mrr zojVXI{yiKnlSRcKYNe687u?#^gp%X<$7d_1CC*mHf~PQngR+&a@-B2WB9K3NWye`a zwZd;I=Y}}`a1#3%_OT>3HpJ{^X75D(+~2a1f!yZlE)qQ7MS|y>36 z37&9OCu9*%c~QhuUL<(VnNa3n=9q-%yr{;LUL<(dnLyvQZk}AxrQlJ%G|0~Tcr^FN zqiI&{b2tbU6!6686O<~u*`-b25&kYz5_&gWWeB4idWJB&Vbc(}PM|fEW;fOqgI5XG z;*!<4WIZlfk4vS87cYK$L~jVIirYCEZR1ce1r4=YvgFVv2%;NWQd&W#1SvcfD&4Ix z0>+3UV@$-D#thV!-D4xhvLd4`Vq8*Wj8lx7;OZi0e57(ukujlgPSwZ|lkMv2-sZ^o zDkGyyo4N!9&#*qi$qAkVCe*Vew$q=3z`FB3ir@&VV5N`VT!T-P9{2gb*UO|}FI3M_ z+@K6*f-%U>Y?eo_TVE!=Sc!R@Us^jC3Dh(o=LfJsjUR$sJt3=0Pg1x1 z2MYHNYYr!3n9BV^J+F1MgKKpb>&oVgfTjSxhlALFEOYcla8Eng?hu${Ri2# z{b)@!t}a%%E}ai<@hM=?^(s{NE54_zJ2D$Q^UDklO~(c+{oODXTWqP3gKQ~NY6hdT zbyG#tW5*sPg4r+;%mK*l;V!a&f^)+Gy6La+tiu}2k2F|U)lwv~AR6^8V(_b_KT996 z{iQ$pE4Kf~>0iB2yxfz2&|}y074Rx}3M-fk8we<@32-Cebk=q_t&n|2-$Ex?f{~o~_TM*|HSvU; z>r`#bglU_V0@tBs+IoG z!l6@|PdkY7+=!cqT5yzGfkV-VB^!dZSFM5Lh&E&CT!%B_h-FLYPw)UnNF(Mfo5x{n zV{!YFESz22*ubNJ6@pp9#YdF_CE6wn->=|XRp_l9#phJ~g2bP|(o`wwS$SQlq)!x_ zE0>m*(z95fB;6|eElK?*OHIpkB<*w=wn>JE6}~L>os6WvH<*(tVR*h!xYn;pI+%P0 zP*Z$IGjYwOw@Q}6Tv}|0>B*^QG>4Yh(kaTlvz7lAXW4%ZDTX~shLt8k^E0I> z%h=B8=$52Mvf)+e*N4izwI<`Q!o8B-_gMU6)y!wnTq-ymGw0EP6p!yG7;Bo|b$4S- z^UB$OuYglUZyFz=?r=0vMJtocNhLo5zSLycq~KZZyCCE_JZbj*MeeQv* zExjW(8WO3f-z1oFa6QzJlGCy~QtR%tIE*jSvGxZ zg3V3082(N*bGPEmRh(Zc&8a1&khTLx%}mhF(z0ef9S}mRr+-oKHwxaU;C+CS7NA3t zt~Nt14keg%4t#(#Q}7Ch@kJiPJKaj?JnjtxyfDL@E_XQa5uy?B8}N;!i^`gSN1B_B zF~DD<@qh=*xb6?&S4q#g3>RCU8WDd{9cCt^TZY)kbd4@#Qc;sJl66IDI;gNnv20tB z;;`MVs9t);Y=`Xam}<7qHU(wt37;L*1DT-Bit42mCGGIovua}td+De#-!y19uJJ^@ z^p(s|&8Amks@WN;C1?mX9hR*E<?_@?ms1-K!;xns zRnm%xqG$AaQ1{2wQ{Fx?lzyhDJPk=K#3sIOEZ57^9%CVX@VKjusa`Dd>&UAa8nKe|WsQ=Rb;z_EdMT+XzK6ZzJYQ&kCH7nuNdTNU(Okq8Zpj#Am zi@ny~Y&OugNM?82pNa;$S5Z4?L*i9xq~{|U?FrF0pT353@j%~3(~U93U2CF`6%}=@ ziT)H*^Ap?57Lqusac9~=jiGEzJyx>AY@-%MMS~bmD-;zCVmuvEXD5!l@BwooIXF1L z!S=Q3`818Zm?|i$DyGizST;PSx*evPVrrM7CMs$Nm5ayCY4qDjMwjB(r&H<7X{rSk z>eK0FMeU$JTdPBwPCtvuAHy{>X(TULh}rjzq1x%RP*J_~Yf!T&r>H1n+UZ(FZKN%< zPqfp{n0gJ=8T8yB&Dr#FEZc+SdN%zcruspJv+4K8seTa)?@_9E<8({3k$$eIhZGex zKbxM2Wj83<+sDb?i)BwK887@#>I}b;9)N5Yc&Jzc3kY5wuz;|5mB(;smf>eOpJ}uj z)dbzHDn9`oK~_2I&oAZ8>7h(nnTZ98H5cN5EMoj|r9Zgt53rL7EJUoi80SE&ECrK` z(W>$Vs>w@~iOov<1$G@l!+I3jp^O~PHLZ4}qoln@1{VCw2 za-k)}`mCwtwSC!Atyk&yYKO6Ne4_m{+sv?Zyq2ZU({u1UQGMooXx7`y0q15`X@|87 zk<7i?v)RkFX`$Ggxl(Hvmtq_{(R@8%skIQWG0X7Q48xzL0kvDSZfz(1v$YZMUGFw+ zBz=*%ANc>smeB!t~X#QsNZwFuX^ zS87ku>F$f#TJihDtJ-?uTl499afSI4t%Tmt-_km$IrR&`l>Q!iU0(J(jPKj#r`i@V z5AXe3#6M-{Q?GEHGSMqqGnHbe;27E?I^1fpN4%kr5KoEA%f<;;Oe&uY_-wXa98fwh ziiXfwE?yM7vzMZBKj!bSb`G4A*ZRx8F8Wok-+}5@>KD^Rr#LL0NQL4xHBIkmZ|Ivu zzpxW`i_f%kv-bj@UjBgiOw=SF27c7uCldOa((edYpXMD9Lv_3KB~cHE5Y}(je+bU* zWca3N*T0#5TP)U_^-lq-0Y9M*>{*`>b2{{cfSShq)w;BgiUdMZ*VpSK(;3~>wq%C@ zj<;&{ep;*UHFjx}p4Wfpjn}uJv90u(SXFYW-mANrc3soHmnlQow%d#J7V7lQ549GI z<}IzCHhDMc>$QA#v%V*;Rw&t~?^XCy`jo`q=!=yqvC8-oQ?RYbEmu+);^REEB?dyodDGyhTx!lnTDg8mm$7FzOV526+TlJKQa5Z3fh0H5rkAh=p1vZAq=r2^RouaMRzOCT^g{Pf`;s$ZMxKq3<9DSrd zM_;AiuRo$cslTSbt0%CjB(eG6AZG8wZrYXJ4|tD)9UkL(hv6PT?4{VsG{g<=N;Hn>;wcNv!E;*Z$~piWDtCFyB=%sS0$P3v`(23Hd{?#Ah~*Yi5Gy-6kssHDhnd)`W? z-JW;coLC(Fyq?1*p;)b|S9?~W5S)r zh1XJe@WT4!G*n6Jx>@ecEBxrf#xUXLQ|OLeqwAKIMg!?|i6!lFZzeE&a2xdUF1n+a zd--zax%r_o!tFX@y$rz`)QvhUM?6d$2Gcb<1`BdNaIpy~W;Qfmy;(qdvbL zCfG*40YkP1N{lH(8C*{_?;`J97{s=M`mMI^b)+N-uY)~EUVajcc=>TQcp_cK!$3v! z!fOTUwd%GdqH!RkHT1h3zR}X6#IoRyD{HE&ZLbRMhNZLAFz4|QyenlL)p+@3h2M6J z3=_7OPuMnGk}kT$W|ypX^Ovbk%){)V_ilcz8dCmBp2Ra*)N_P;6GR@6z!hsOQ7GM^{VG20gb@MwT^SdJI(MrqmdN!T>Pigh+ zHSj0v=}7gvwq(s2I*-IS>!W^?R z4{?~L(-U|?mPt!^lf27xN2_+~gqQF4^8Z;=jk+n@e&&W1=MSCu-WGe@3scYEH+kWt za|+*{H@+}t#lcXQHKvgGXY0~y75M30de`II&3?!Wsr<2*iG2dU>r1arBCzLSo}_mX zzAgB+;fs?7CK2N?c|L3KKA~x8zCm$sTQCZ*E=4A~YnLHNP~U+gy=4m`TX+iR;Og0w zWbr4yz^*f+%rjA|Ep7S;q`igLFA7bAm$kwi|?g(;k%*mlWQvEAA$aHL*dug3@_`rZ0yi+^4nQX}xXM{|5ak>r4Ou diff --git a/dist/UbisamBase.Shell.exe b/dist/UbisamBase.Shell.exe index a4be4963e8c9251b3a4d854e0e16fabeeeae0a33..0566d3f817a7985882fa88f6317952dc1f123942 100644 GIT binary patch delta 110 zcmZoz!rHKebwUS=@Z;Y98+$l-1XY)p;OCo{@J6t)>|@FOIY}fy zAUUo2(66;Mev|VIJWsT|TQfO9q)q`UI8PWV2vTe&p|2kKT3<=kBkOQTD E0l-Nya{vGU delta 110 zcmZoz!rHKebwUTr(G}Ql|hD%!dks6!)*HuL>x$=bAss>r3-Lk?sFP7@2GV DdJ{2E diff --git a/dist/platform-version.json b/dist/platform-version.json index d3ccb19..8e2fc96 100644 --- a/dist/platform-version.json +++ b/dist/platform-version.json @@ -1,4 +1,4 @@ { -"version": "2026-09-21 22:36:26", +"version": "2026-09-21 22:42:14", "configuration": "Release" } diff --git a/doc/history/changelog.md b/doc/history/changelog.md index d53fa56..55d5a10 100644 --- a/doc/history/changelog.md +++ b/doc/history/changelog.md @@ -18,3 +18,4 @@ | 2026-09-21 | 차트 종류별 디자인 정리 — 면적·계단선·누적/가로 막대·원형·도넛·산점 추가, 계열 팔레트(Chart.Series1~6)와 툴팁·범례 테마 적용 | | 2026-09-21 | 업데이트 진행 창 추가 — 런처를 누르자마자 확인/받기 상태와 진행률을 보여주고, 다 받은 뒤 설치 여부를 묻는다 | | 2026-09-21 | Shell.exe를 직접 실행하면 런처로 넘기도록 — 진입점을 런처 하나로 통일(업데이트 확인 누락 방지) | +| 2026-09-21 | 런처 창(진행·업데이트 안내)이 앱의 테마 설정(다크/라이트)을 따르도록 — 윈도우 설정만 보던 것을 수정 | diff --git a/src/UbisamBase.Launcher/LauncherTheme.cs b/src/UbisamBase.Launcher/LauncherTheme.cs new file mode 100644 index 0000000..bf4c6bd --- /dev/null +++ b/src/UbisamBase.Launcher/LauncherTheme.cs @@ -0,0 +1,91 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; +using Microsoft.Win32; + +namespace UbisamBase.Launcher; + +/// +/// 런처가 띄우는 창(진행 창·업데이트 안내창)의 밝기를 정한다. +/// +/// 런처는 Core를 참조할 수 없어서(갱신 대상인 Core.dll을 물게 된다) UiSettingsService를 쓸 수 없지만, +/// 그 서비스가 저장해 둔 파일은 그대로 읽을 수 있다. 사용자가 앱에서 다크로 해뒀는데 런처 창만 +/// 윈도우 설정(밝게)을 따라가면 혼자 하얗게 떠서 튄다 — 그래서 앱 설정을 먼저 보고, +/// "시스템 설정 따르기"이거나 파일이 없을 때만 윈도우 설정을 본다. +/// +internal static class LauncherTheme +{ + // 설정 폴더는 Core의 UbisamAppBuilder.ConfigRoot와 같은 고정 경로다(앱이 달라도 같은 폴더를 쓴다). + private const string UiSettingsPath = @"D:\UbisamConfig\Settings\UiSettingsService.json"; + + /// 지금 밝은 테마로 그려야 하는가. + public static bool IsLight() + { + var mode = ReadThemeMode(); + + return mode switch + { + ThemeMode.Light => true, + ThemeMode.Dark => false, + _ => IsSystemLightTheme() + }; + } + + /// Core의 UbisamBase.Core.Settings.ThemeMode와 값·순서가 같아야 한다(파일에 숫자로 저장된다). + private enum ThemeMode + { + System = 0, + Light = 1, + Dark = 2 + } + + private static ThemeMode ReadThemeMode() + { + try + { + if (!File.Exists(UiSettingsPath)) + { + return ThemeMode.System; + } + + var json = File.ReadAllText(UiSettingsPath); + + // 숫자로 저장된 경우(지금 방식) + var number = Regex.Match(json, "\"ThemeMode\"\\s*:\\s*(\\d+)"); + if (number.Success && int.TryParse(number.Groups[1].Value, out var value) && + Enum.IsDefined(typeof(ThemeMode), value)) + { + return (ThemeMode)value; + } + + // 이름으로 저장된 경우(나중에 문자열 변환기를 붙이더라도 깨지지 않게) + var name = Regex.Match(json, "\"ThemeMode\"\\s*:\\s*\"(\\w+)\""); + if (name.Success && Enum.TryParse(name.Groups[1].Value, ignoreCase: true, out var parsed)) + { + return parsed; + } + } + catch + { + // 읽지 못하면 시스템 설정을 따른다. + } + + return ThemeMode.System; + } + + /// 윈도우가 밝은 테마인지. Core의 UiSettingsService.IsSystemLightTheme과 같은 판정이다. + private static bool IsSystemLightTheme() + { + try + { + using var key = Registry.CurrentUser.OpenSubKey( + @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"); + + return key?.GetValue("AppsUseLightTheme") is not int value || value != 0; + } + catch + { + return true; + } + } +} diff --git a/src/UbisamBase.Launcher/ProgressWindow.xaml.cs b/src/UbisamBase.Launcher/ProgressWindow.xaml.cs index e99e5b3..a6fb028 100644 --- a/src/UbisamBase.Launcher/ProgressWindow.xaml.cs +++ b/src/UbisamBase.Launcher/ProgressWindow.xaml.cs @@ -3,7 +3,6 @@ using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; -using Microsoft.Win32; namespace UbisamBase.Launcher; @@ -21,7 +20,7 @@ public partial class ProgressWindow : Window public ProgressWindow() { InitializeComponent(); - ApplyTheme(IsSystemLightTheme()); + ApplyTheme(LauncherTheme.IsLight()); SizeChanged += (_, _) => UpdateFillWidth(animate: false); } @@ -93,20 +92,5 @@ public partial class ProgressWindow : Window private static SolidColorBrush Brush(string hex) => new SolidColorBrush((Color)ColorConverter.ConvertFromString(hex)); - private static bool IsSystemLightTheme() - { - try - { - using var key = Registry.CurrentUser.OpenSubKey( - @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"); - - return key?.GetValue("AppsUseLightTheme") is not int value || value != 0; - } - catch - { - return true; - } - } - private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) => DragMove(); } diff --git a/src/UbisamBase.Launcher/UpdateDialog.xaml.cs b/src/UbisamBase.Launcher/UpdateDialog.xaml.cs index 04bf4d6..0fb4c5c 100644 --- a/src/UbisamBase.Launcher/UpdateDialog.xaml.cs +++ b/src/UbisamBase.Launcher/UpdateDialog.xaml.cs @@ -2,7 +2,6 @@ using System; using System.Windows; using System.Windows.Input; using System.Windows.Media; -using Microsoft.Win32; namespace UbisamBase.Launcher; @@ -22,7 +21,7 @@ public partial class UpdateDialog : Window CurrentValue.Text = string.IsNullOrEmpty(currentVersion) ? "(알 수 없음)" : currentVersion; NewValue.Text = newVersion; - ApplyTheme(IsSystemLightTheme()); + ApplyTheme(LauncherTheme.IsLight()); } /// 보조 버튼에 마우스를 올렸을 때 깔리는 색. 템플릿에서 바인딩해 쓴다. @@ -73,22 +72,6 @@ public partial class UpdateDialog : Window private static SolidColorBrush Brush(string hex) => new SolidColorBrush((Color)ColorConverter.ConvertFromString(hex)); - /// 윈도우가 밝은 테마인지. Core의 UiSettingsService.IsSystemLightTheme과 같은 판정이다. - private static bool IsSystemLightTheme() - { - try - { - using var key = Registry.CurrentUser.OpenSubKey( - @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"); - - return key?.GetValue("AppsUseLightTheme") is not int value || value != 0; - } - catch - { - return true; - } - } - /// 제목줄이 없으므로 창 아무 데나 끌어서 옮길 수 있게 한다. private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) => DragMove();