Dreamine.UI.Wpf.Controls 1.0.1
Dreamine.UI.Wpf.Controls 사용자 인터페이스 기능과 구성 요소를 제공합니다.
로딩중...
검색중...
일치하는것 없음
Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager 클래스 참조

더 자세히 ...

Public 멤버 함수

void SetPopupSize (string name, double width, double height)
void CreatePopup (string name, LoadedViewInfo loadedViewInfo, double? popupWidth=null, double? popupHeight=null, bool centerOnScreen=false)
void Clear ()
void Show (string name)
void HideAllExcept (string name)
void CloseAll ()

속성

double Width = 800 [get, set]
double Height = 600 [get, set]
static PopupWindowManager Instance = new() [get]
IReadOnlyDictionary< string, Window > Windows [get]

정적 Private 멤버 함수

static void SetPopupPosition (Window popup, Window? owner)

Private 속성

readonly Dictionary< string, Window > _popupWindows = new()

상세한 설명

View와 ViewModel을 별도 테두리 없는 최상위 Window로 감싸 등록·표시·숨김 처리합니다.

PopupWindowManager.cs 파일의 18 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ Clear()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.Clear ( )
inline

현재 표시 중인 등록 팝업을 닫고 내부 목록을 비웁니다.

PopupWindowManager.cs 파일의 427 번째 라인에서 정의되었습니다.

428 {
429 foreach (var popup in _popupWindows.Values)
430 {
431 if (popup.IsVisible)
432 popup.Close();
433 }
434
435 _popupWindows.Clear();
436 }

다음을 참조함 : _popupWindows.

◆ CloseAll()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.CloseAll ( )
inline

등록된 모든 팝업 창을 닫고 내부 사전에서 제거합니다.

PopupWindowManager.cs 파일의 514 번째 라인에서 정의되었습니다.

515 {
516 foreach (var popup in _popupWindows.Values)
517 popup.Close();
518
519 _popupWindows.Clear();
520 }

다음을 참조함 : _popupWindows.

◆ CreatePopup()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.CreatePopup ( string name,
LoadedViewInfo loadedViewInfo,
double? popupWidth = null,
double? popupHeight = null,
bool centerOnScreen = false )
inline

로드된 View 정보를 독립 팝업 창으로 만들고 수명 주기와 위치 처리기를 연결한 뒤 등록합니다.

매개변수
name팝업의 고유 등록 이름입니다.
loadedViewInfo표시할 View 정보를 포함한 값입니다.
popupWidth선택적 너비이며 생략하면 Width입니다.
popupHeight선택적 높이이며 생략하면 Height입니다.
centerOnScreen소유자 대신 화면 중앙에 배치하려면 true입니다.
예외
InvalidOperationException표시 가능한 View가 없거나 창 상태가 팝업 표시를 허용하지 않으면 발생할 수 있습니다.
NullReferenceException현재 WPF 애플리케이션이 없으면 Dispatcher 접근 중 발생할 수 있습니다.
ArgumentNullExceptionname 이 null인 상태에서 등록하면 발생합니다.

PopupWindowManager.cs 파일의 195 번째 라인에서 정의되었습니다.

196 {
197 FrameworkElement view = loadedViewInfo.View
198 ?? loadedViewInfo.FrameworkView
199 ?? throw new InvalidOperationException($"Popup view '{name}' could not be created.");
200
201 object? viewModel = view.DataContext;
202
203 if (!Application.Current.Dispatcher.CheckAccess())
204 {
205 Application.Current.Dispatcher.Invoke(() => CreatePopup(name, loadedViewInfo, popupWidth, popupHeight, centerOnScreen));
206 return;
207 }
208
209 var owner = Application.Current?.MainWindow;
210
211 Window popup;
212
213 view.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
214 var desired = view.DesiredSize;
215
216 if (loadedViewInfo.View == null)
217 {
218 popup = new Window
219 {
220 Title = "",
221 Content = view,
222 DataContext = viewModel,
223 WindowStartupLocation = WindowStartupLocation.CenterScreen,
224 WindowStyle = WindowStyle.None,
225 ResizeMode = ResizeMode.NoResize,
226 Background = Brushes.White,
227 Width = desired.Width,
228 Height = desired.Height,
229 ShowInTaskbar = false,
230 Topmost = true,
231 };
232 }
233 else
234 {
235 popup = new Window
236 {
237 Title = "",
238 Content = view,
239 DataContext = viewModel,
240 WindowStartupLocation = WindowStartupLocation.CenterOwner,
241 WindowStyle = WindowStyle.None,
242 ResizeMode = ResizeMode.NoResize,
243 // AllowsTransparency=true는 Background가 완전 불투명(White)이라 시각적으로
244 // 필요 없고, 레이어드 윈도우(WS_EX_LAYERED)로 만들어져 일부 환경(원격 데스크톱/
245 // 가상 머신/특정 GPU 드라이버)에서 마우스 입력이 전달되지 않는 문제를 유발할 수
246 // 있어 제거했다.
247 ShowActivated = true,
248 Background = Brushes.White,
249 Width = desired.Width,
250 Height = desired.Height,
251 ShowInTaskbar = false,
252 Topmost = true
253 };
254 }
255
256 // 크기 조정
257 popup.Width = popupWidth ?? Width;
258 popup.Height = popupHeight ?? Height;
259
260 // centerOnScreen 플래그를 Tag에 저장해 이후 핸들러에서 참조
261 popup.Tag = centerOnScreen;
262
263 // 최초 Owner + 위치 설정 (여기서만 Owner를 건드림)
264 if (owner != null && owner.IsLoaded && owner.IsVisible)
265 {
266 try
267 {
268 popup.Owner = owner;
269 }
270 catch (Exception ex)
271 {
272 Debug.WriteLine($"[Popup] Owner 설정 실패({name}): {ex.Message}");
273 }
274
275 SetPopupPosition(popup, owner);
276 }
277 else
278 {
279 popup.WindowStartupLocation = WindowStartupLocation.CenterScreen;
280 }
281
282 // Owner가 나중에 보이게 되는 경우를 위한 보정
283 if (owner != null && !owner.IsVisible)
284 {
285#pragma warning disable CS1587 // Doxygen documents local functions; the C# compiler does not attach XML docs to them.
312 void OnOwnerReady(object? s, EventArgs e)
313 {
314 owner!.ContentRendered -= OnOwnerReady;
315
316 if (!popup.IsVisible)
317 return;
318
319 if (!owner.IsLoaded)
320 return;
321
322 try
323 {
324 popup.Owner = owner;
325 }
326 catch (Exception ex)
327 {
328 Debug.WriteLine($"[Popup] ContentRendered Owner 설정 실패({name}): {ex.Message}");
329 }
330
331 SetPopupPosition(popup, owner);
332 }
333#pragma warning restore CS1587
334
335 owner.ContentRendered += OnOwnerReady;
336 popup.Closed += (_, _) => owner!.ContentRendered -= OnOwnerReady;
337 }
338
339 popup.Loaded += (s, e) => popup.Hide();
340 popup.Show();
341 ViewSwitcher.NotifyShown(name);
342
343 // 위치만 조정 (Owner는 다시 세팅하지 않음)
344 popup.IsVisibleChanged += (_, __) =>
345 {
346 if (!popup.IsVisible)
347 return;
348
349 SetPopupPosition(popup, owner);
350 };
351
352 // 앱 종료 중이면 그냥 닫고, 평소엔 Hide 재사용
353 popup.Closing += (s, e) =>
354 {
355 ViewSwitcher.NotifyHidden(name);
356
357 // Owner가 이미 죽었거나, 애플리케이션이 종료 진행 중이면 그냥 닫게 둠
358 var app = Application.Current;
359 bool ownerDead = owner == null || !owner.IsLoaded;
360 bool appShuttingDown = app is { ShutdownMode: ShutdownMode.OnExplicitShutdown } && app.MainWindow == null;
361
362 if (ownerDead || appShuttingDown)
363 {
364 // e.Cancel = false → 실제로 닫힘
365 return;
366 }
367
368 // 정상 동작 중에는 닫지 않고 숨김
369 SetPopupPosition(popup, owner);
370 popup.Hide();
371 e.Cancel = true;
372 };
373
374 _popupWindows[name] = popup;
375 }

다음을 참조함 : _popupWindows, CreatePopup(), Height, Dreamine.UI.Wpf.Controls.ViewRegion.ViewSwitcher.NotifyHidden(), Dreamine.UI.Wpf.Controls.ViewRegion.ViewSwitcher.NotifyShown(), SetPopupPosition(), Width.

다음에 의해서 참조됨 : CreatePopup().

이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ HideAllExcept()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.HideAllExcept ( string name)
inline

지정한 이름을 제외한 표시 중인 모든 팝업 창을 숨깁니다.

매개변수
name표시 상태를 유지할 팝업 이름입니다.

PopupWindowManager.cs 파일의 497 번째 라인에서 정의되었습니다.

498 {
499 foreach (var kv in _popupWindows)
500 {
501 if (kv.Key != name && kv.Value.IsVisible)
502 kv.Value.Hide();
503 }
504 }

다음을 참조함 : _popupWindows.

◆ SetPopupPosition()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.SetPopupPosition ( Window popup,
Window? owner )
inlinestaticprivate

팝업을 화면 또는 표시 중인 소유자 창의 중앙에 배치합니다.

매개변수
popup위치를 조정할 팝업입니다.
owner선택적 소유자 창입니다.

PopupWindowManager.cs 파일의 401 번째 라인에서 정의되었습니다.

402 {
403 bool centerOnScreen = popup.Tag is true;
404
405 if (centerOnScreen)
406 {
407 var screenWidth = SystemParameters.PrimaryScreenWidth;
408 var screenHeight = SystemParameters.PrimaryScreenHeight;
409 popup.Left = (screenWidth - popup.Width) / 2;
410 popup.Top = (screenHeight - popup.Height) / 2;
411 }
412 else if (owner != null && owner.IsLoaded && owner.IsVisible)
413 {
414 popup.Left = owner.Left + (owner.Width - popup.Width) / 2;
415 popup.Top = owner.Top + (owner.Height - popup.Height) / 2;
416 }
417 }

다음에 의해서 참조됨 : CreatePopup().

이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ SetPopupSize()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.SetPopupSize ( string name,
double width,
double height )
inline

등록된 팝업 창의 너비와 높이를 변경합니다.

매개변수
name팝업 등록 이름입니다.
width새 너비입니다.
height새 높이입니다.
예외
KeyNotFoundExceptionname 에 해당하는 팝업이 없으면 발생합니다.
ArgumentException너비 또는 높이가 WPF 창 크기로 유효하지 않으면 발생할 수 있습니다.

PopupWindowManager.cs 파일의 107 번째 라인에서 정의되었습니다.

108 {
109 _popupWindows[name].Width = width;
110 _popupWindows[name].Height = height;
111 }

다음을 참조함 : _popupWindows.

◆ Show()

void Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.Show ( string name)
inline

지정한 이름의 팝업을 표시하고 활성화합니다.

매개변수
name표시할 팝업 이름입니다.
예외
ArgumentNullExceptionname 이 null이면 발생합니다.
InvalidOperationException창을 표시하거나 활성화할 수 없는 상태이면 발생할 수 있습니다.

PopupWindowManager.cs 파일의 470 번째 라인에서 정의되었습니다.

471 {
472 if (_popupWindows.TryGetValue(name, out var popup))
473 {
474 if (!popup.IsVisible)
475 popup.Show();
476
477 popup.Activate();
478 }
479 }

다음을 참조함 : _popupWindows.

멤버 데이터 문서화

◆ _popupWindows

readonly Dictionary<string, Window> Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager._popupWindows = new()
private

이름별 등록된 팝업 창 저장소입니다.

PopupWindowManager.cs 파일의 57 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : Clear(), CloseAll(), CreatePopup(), HideAllExcept(), SetPopupSize(), Show().

속성 문서화

◆ Height

double Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.Height = 600
getset

새 팝업의 기본 높이를 가져오거나 설정합니다.

PopupWindowManager.cs 파일의 38 번째 라인에서 정의되었습니다.

38{ get; set; } = 600;

다음에 의해서 참조됨 : CreatePopup().

◆ Instance

PopupWindowManager Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.Instance = new()
staticget

공유 팝업 창 관리자 인스턴스를 가져옵니다.

PopupWindowManager.cs 파일의 48 번째 라인에서 정의되었습니다.

48{ get; } = new();

◆ Width

double Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.Width = 800
getset

새 팝업의 기본 너비를 가져오거나 설정합니다.

PopupWindowManager.cs 파일의 28 번째 라인에서 정의되었습니다.

28{ get; set; } = 800;

다음에 의해서 참조됨 : CreatePopup().

◆ Windows

IReadOnlyDictionary<string, Window> Dreamine.UI.Wpf.Controls.ViewRegion.PopupWindowManager.Windows
get

현재 등록된 이름별 팝업 창을 읽기 전용 인터페이스로 가져옵니다.

PopupWindowManager.cs 파일의 121 번째 라인에서 정의되었습니다.


이 클래스에 대한 문서화 페이지는 다음의 파일로부터 생성되었습니다.: