SampleCrossUi.WinForms 1.0.0.0
SampleCrossUi.WinForms 사용 방법을 보여 주는 예제 프로젝트입니다.
로딩중...
검색중...
일치하는것 없음
MainForm.cs
이 파일의 문서화 페이지로 가기
1using System.ComponentModel;
2using System.Linq;
3using Dreamine.UI.WinForms;
4using Dreamine.UI.WinForms.Controls;
5using SampleCrossUi.Shared.ViewModels;
7
9
18public sealed class MainForm : Form
19{
20 // ── Designer-visible fields ──────────────────────────
29 private Panel _pageHost = null!;
38 private Panel _navPanel = null!;
47 private FlowLayoutPanel _navFlow = null!;
56 private DreamineButton _btnCounter = null!;
65 private DreamineButton _btnLightBulb = null!;
74 private DreamineButton _btnControls = null!;
83 private DreamineButton _btnPopup = null!;
84
85 // ── Runtime-only fields ──────────────────────────────
94 private DreamineButton[] _navButtons = null!;
103 private UserControl? _currentPage;
112 private CounterPage _counterPage = null!;
139 private PopupPage _popupPage = null!;
140
149 public MainForm() : this(
150 new CounterViewModel(new CounterEvent(new SampleCrossUi.Shared.Services.CounterService())),
151 new LightBulbViewModel(new LightBulbEvent(new LightBulbModel()))) { }
152
177 public MainForm(CounterViewModel counterVm, LightBulbViewModel lightBulbVm)
178 {
180
181 Resize += (_, _) => CenterNavFlow();
182 Load += (_, _) => CenterNavFlow();
183
185 for (int i = 0; i < _navButtons.Length; i++)
186 {
187 var idx = i;
188 _navButtons[i].Click += (_, _) => Navigate(idx);
189 }
190
191 if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
192 return;
193
194 _counterPage = new CounterPage(counterVm);
195 _lightBulbPage = new LightBulbPage(lightBulbVm);
196 _controlsPage = new ControlsPage(new ControlsViewModel(new ControlsEvent()));
197 _popupPage = new PopupPage();
198
199 Navigate(0);
200 }
201
218 private void Navigate(int index)
219 {
220 for (int i = 0; i < _navButtons.Length; i++)
221 _navButtons[i].IsSelected = i == index;
222
223 _currentPage?.Hide();
224
225 _currentPage = index switch
226 {
227 0 => _counterPage,
228 1 => _lightBulbPage,
229 2 => _controlsPage,
230 3 => _popupPage,
231 _ => _counterPage,
232 };
233
234 if (!_pageHost.Controls.Contains(_currentPage))
235 {
236 _currentPage.Dock = DockStyle.Fill;
237 _pageHost.Controls.Add(_currentPage);
238 }
239 _currentPage.Show();
240 _currentPage.BringToFront();
241 }
242
251 private void InitializeComponent()
252 {
253 _btnCounter = new DreamineButton();
254 _btnLightBulb = new DreamineButton();
255 _btnControls = new DreamineButton();
256 _btnPopup = new DreamineButton();
257 _navFlow = new FlowLayoutPanel();
258 _navPanel = new Panel();
259 _pageHost = new Panel();
260
261 SuspendLayout();
262
263 // _btnCounter — WPF DreamineNavigationBar 버튼과 동일한 크기/배치(가로 나열)
264 _btnCounter.Content = "Counter";
265 _btnCounter.Width = 140;
266 _btnCounter.Height = 40;
267 _btnCounter.CornerRadius = 6;
268 _btnCounter.Margin = new Padding(4);
269 _btnCounter.Name = "_btnCounter";
270
271 // _btnLightBulb
272 _btnLightBulb.Content = "Light Bulb";
273 _btnLightBulb.Width = 140;
274 _btnLightBulb.Height = 40;
275 _btnLightBulb.CornerRadius = 6;
276 _btnLightBulb.Margin = new Padding(4);
277 _btnLightBulb.Name = "_btnLightBulb";
278
279 // _btnControls
280 _btnControls.Content = "Controls";
281 _btnControls.Width = 140;
282 _btnControls.Height = 40;
283 _btnControls.CornerRadius = 6;
284 _btnControls.Margin = new Padding(4);
285 _btnControls.Name = "_btnControls";
286
287 // _btnPopup
288 _btnPopup.Content = "Popup";
289 _btnPopup.Width = 140;
290 _btnPopup.Height = 40;
291 _btnPopup.CornerRadius = 6;
292 _btnPopup.Margin = new Padding(4);
293 _btnPopup.Name = "_btnPopup";
294
295 // _navFlow — WPF처럼 가로로 나열되는 네비게이션 버튼들
296 _navFlow.Dock = DockStyle.Fill;
297 _navFlow.FlowDirection = FlowDirection.LeftToRight;
298 _navFlow.WrapContents = false;
299 _navFlow.Anchor = AnchorStyles.None;
300 _navFlow.AutoSize = true;
301 _navFlow.Controls.Add(_btnCounter);
302 _navFlow.Controls.Add(_btnLightBulb);
303 _navFlow.Controls.Add(_btnControls);
304 _navFlow.Controls.Add(_btnPopup);
305
306 // _navPanel — 상단 가로 네비게이션 바(WPF MainWindow의 DreamineNavigationBar 행과 동일한 위치)
307 _navPanel.Dock = DockStyle.Top;
308 _navPanel.Height = 64;
309 _navPanel.BackColor = DreamineTheme.NavBackground;
310 _navPanel.Padding = new Padding(5);
311 _navPanel.Controls.Add(_navFlow);
312
313 // _pageHost
314 _pageHost.Dock = DockStyle.Fill;
315 _pageHost.BackColor = DreamineTheme.AppBackground;
316
317 // MainForm
318 Text = "Dreamine Cross-UI — WinForms";
319 ClientSize = new Size(1100, 860);
320 MinimumSize = new Size(960, 700);
321 StartPosition = FormStartPosition.CenterScreen;
322 BackColor = DreamineTheme.AppBackground;
323 Name = "MainForm";
324 Controls.Add(_pageHost);
325 Controls.Add(_navPanel);
326
327 ResumeLayout(false);
328 }
329
338 private void CenterNavFlow()
339 {
340 var totalWidth = _navFlow.Controls.Cast<Control>().Sum(c => c.Width + c.Margin.Horizontal);
341 var offset = Math.Max(0, (_navPanel.Width - totalWidth) / 2);
342 _navFlow.Padding = new Padding(offset, 0, 0, 0);
343 }
344
361 protected override void Dispose(bool disposing)
362 {
363 if (disposing)
364 {
365 _counterPage?.Dispose();
366 _lightBulbPage?.Dispose();
367 _controlsPage?.Dispose();
368 _popupPage?.Dispose();
369 }
370 base.Dispose(disposing);
371 }
372}
override void Dispose(bool disposing)
Definition MainForm.cs:361
DreamineButton[] _navButtons
Definition MainForm.cs:94
MainForm(CounterViewModel counterVm, LightBulbViewModel lightBulbVm)
Definition MainForm.cs:177