DreamineVMS 1.0.0.0
Windows PC의 RTSP·USB 카메라 영상을 HLS로 변환해 원격 CCTV Viewer에 전달하는 데스크톱 에이전트입니다.
로딩중...
검색중...
일치하는것 없음
DreamineVMS.Views.MainWindow 클래스 참조

더 자세히 ...

DreamineVMS.Views.MainWindow에 대한 상속 다이어그램 :
DreamineVMS.Views.MainWindow에 대한 협력 다이어그램:

Public 멤버 함수

 MainWindow (IOptions< VmsServerOptions > serverOptions)

Private 멤버 함수

void OnDataContextChanged (object sender, DependencyPropertyChangedEventArgs e)
void OnOpenLiveTabRequested (object? sender, EventArgs e)
async void OnLoaded (object sender, RoutedEventArgs e)
void OnClosed (object? sender, EventArgs e)
async void OnMainTabSelectionChanged (object sender, System.Windows.Controls.SelectionChangedEventArgs e)
void AgentPasswordBox_PasswordChanged (object sender, RoutedEventArgs e)
async Task EnsureSelectedLiveWebViewAsync ()
async Task EnsureWpfLiveWebViewAsync ()
async Task EnsureCamerasWebViewAsync ()
string GetLiveUrl ()
void RegisterWebViewRecovery (WebView2 webView, Func< string > urlFactory)

정적 Private 멤버 함수

static void TryNavigateWebView (WebView2 webView, string url)
static void TryDisposeWebView (ref WebView2? webView)
static async Task NavigateServerAsync (WebView2 webView, string url, int timeoutMs=15000, int intervalMs=500)

Private 속성

readonly VmsServerOptions _serverOptions
MainWindowViewModel_attachedViewModel
WebView2? _wpfLiveWebView
WebView2? _camerasWebView
bool _wpfLiveInitialized
bool _camerasInitialized

상세한 설명

DreamineVMS 메인 윈도우입니다.

MainWindow.xaml.cs 파일의 27 번째 라인에서 정의되었습니다.

생성자 & 소멸자 문서화

◆ MainWindow()

DreamineVMS.Views.MainWindow.MainWindow ( IOptions< VmsServerOptions > serverOptions)
inline

MainWindow 인스턴스를 초기화합니다.

매개변수
serverOptionsVMS 서버 옵션입니다.
예외
ArgumentNullException필수 입력 인자 중 하나가 null인 경우 발생합니다.

MainWindow.xaml.cs 파일의 108 번째 라인에서 정의되었습니다.

109 {
110 _serverOptions = serverOptions?.Value ?? throw new ArgumentNullException(nameof(serverOptions));
111 InitializeComponent();
112
113 if (DesignerProperties.GetIsInDesignMode(this))
114 {
115 return;
116 }
117
118 DataContextChanged += OnDataContextChanged;
119 Loaded += OnLoaded;
120 Closed += OnClosed;
121 MainTabControl.SelectionChanged += OnMainTabSelectionChanged;
122 }

다음을 참조함 : _serverOptions, OnClosed(), OnDataContextChanged(), OnLoaded(), OnMainTabSelectionChanged().

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

멤버 함수 문서화

◆ AgentPasswordBox_PasswordChanged()

void DreamineVMS.Views.MainWindow.AgentPasswordBox_PasswordChanged ( object sender,
RoutedEventArgs e )
inlineprivate

Agent Password Box Password Changed 작업을 수행합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

MainWindow.xaml.cs 파일의 348 번째 라인에서 정의되었습니다.

349 {
350 if (DataContext is MainWindowViewModel vm)
351 vm.AgentSettings.Password = AgentPasswordBox.Password;
352 }

◆ EnsureCamerasWebViewAsync()

async Task DreamineVMS.Views.MainWindow.EnsureCamerasWebViewAsync ( )
inlineprivate

Ensure Cameras Web View Async 작업을 수행합니다.

반환값
Ensure Cameras Web View Async 작업에서 생성한 Task 결과입니다.

MainWindow.xaml.cs 파일의 433 번째 라인에서 정의되었습니다.

434 {
435 if (_camerasInitialized)
436 {
437 return;
438 }
439
440 WebView2 webView = HybridWebViewHost.CreateWebView();
441 CamerasTab.Content = webView;
442 _camerasWebView = webView;
443
444 string camerasUrl = $"http://localhost:{_serverOptions.Port}/cameras";
445 RegisterWebViewRecovery(webView, () => camerasUrl);
446 await NavigateServerAsync(webView, camerasUrl).ConfigureAwait(true);
447 _camerasInitialized = true;
448 }

다음을 참조함 : _camerasInitialized, _camerasWebView, NavigateServerAsync(), RegisterWebViewRecovery().

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

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

◆ EnsureSelectedLiveWebViewAsync()

async Task DreamineVMS.Views.MainWindow.EnsureSelectedLiveWebViewAsync ( )
inlineprivate

Ensure Selected Live Web View Async 작업을 수행합니다.

반환값
Ensure Selected Live Web View Async 작업에서 생성한 Task 결과입니다.

MainWindow.xaml.cs 파일의 370 번째 라인에서 정의되었습니다.

371 {
372 if (MainTabControl.SelectedItem == WpfLiveTab)
373 {
374 await EnsureWpfLiveWebViewAsync().ConfigureAwait(true);
375 return;
376 }
377
378 if (MainTabControl.SelectedItem == CamerasTab)
379 {
380 await EnsureCamerasWebViewAsync().ConfigureAwait(true);
381 }
382 }

다음을 참조함 : EnsureCamerasWebViewAsync(), EnsureWpfLiveWebViewAsync().

다음에 의해서 참조됨 : OnLoaded(), OnMainTabSelectionChanged().

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

◆ EnsureWpfLiveWebViewAsync()

async Task DreamineVMS.Views.MainWindow.EnsureWpfLiveWebViewAsync ( )
inlineprivate

Ensure Wpf Live Web View Async 작업을 수행합니다.

반환값
Ensure Wpf Live Web View Async 작업에서 생성한 Task 결과입니다.

MainWindow.xaml.cs 파일의 400 번째 라인에서 정의되었습니다.

401 {
402 if (_wpfLiveInitialized)
403 {
404 return;
405 }
406
407 WebView2 webView = HybridWebViewHost.CreateWebView();
408 WpfLiveTab.Content = webView;
409 _wpfLiveWebView = webView;
410
411 string liveUrl = GetLiveUrl();
412 RegisterWebViewRecovery(webView, () => liveUrl);
413 await NavigateServerAsync(webView, liveUrl).ConfigureAwait(true);
414 _wpfLiveInitialized = true;
415 }

다음을 참조함 : _wpfLiveInitialized, _wpfLiveWebView, GetLiveUrl(), NavigateServerAsync(), RegisterWebViewRecovery().

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

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

◆ GetLiveUrl()

string DreamineVMS.Views.MainWindow.GetLiveUrl ( )
inlineprivate

Live Url 값을 가져옵니다.

반환값
Get Live Url 작업에서 생성한 string 결과입니다.

MainWindow.xaml.cs 파일의 466 번째 라인에서 정의되었습니다.

467 {
468 return $"http://localhost:{_serverOptions.Port}/live";
469 }

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

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

◆ NavigateServerAsync()

async Task DreamineVMS.Views.MainWindow.NavigateServerAsync ( WebView2 webView,
string url,
int timeoutMs = 15000,
int intervalMs = 500 )
inlinestaticprivate

Navigate Server Async 작업을 수행합니다.

매개변수
webViewweb View에 사용할 WebView2 값입니다.
urlurl에 사용할 string 값입니다.
timeoutMstimeout Ms에 사용할 int 값입니다.
intervalMsinterval Ms에 사용할 int 값입니다.
반환값
Navigate Server Async 작업에서 생성한 Task 결과입니다.

MainWindow.xaml.cs 파일의 652 번째 라인에서 정의되었습니다.

653 {
654 try
655 {
656 await Task.Delay(1500).ConfigureAwait(true);
657
658 using CancellationTokenSource cts = new(timeoutMs);
659 using HttpClient http = new();
660 bool alive = false;
661
662 while (!cts.IsCancellationRequested)
663 {
664 try
665 {
666 HttpResponseMessage response = await http.GetAsync(url, cts.Token).ConfigureAwait(true);
667 if ((int)response.StatusCode >= 200 && (int)response.StatusCode < 400)
668 {
669 alive = true;
670 break;
671 }
672 }
673 catch (HttpRequestException)
674 {
675 // Server may not be ready yet.
676 }
677 catch (TaskCanceledException)
678 {
679 // Retry until overall timeout.
680 }
681
682 await Task.Delay(intervalMs, cts.Token).ConfigureAwait(true);
683 }
684
685 if (!alive)
686 {
687 Debug.WriteLine($"[DreamineVMS] Server dashboard timeout: {url}");
688 await HybridWebViewHost.ShowOfflineMessageAsync(webView, url).ConfigureAwait(true);
689 return;
690 }
691
692 webView.Source = new Uri(url);
693 }
694 catch (TaskCanceledException)
695 {
696 Debug.WriteLine("[DreamineVMS] Server navigation canceled.");
697 }
698 catch (Exception ex)
699 {
700 Debug.WriteLine($"[DreamineVMS] Server navigation failed: {ex}");
701 }
702 }

다음에 의해서 참조됨 : EnsureCamerasWebViewAsync(), EnsureWpfLiveWebViewAsync().

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

◆ OnClosed()

void DreamineVMS.Views.MainWindow.OnClosed ( object? sender,
EventArgs e )
inlineprivate

Closed 이벤트 또는 상태 변경을 처리합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

MainWindow.xaml.cs 파일의 265 번째 라인에서 정의되었습니다.

266 {
267 if (_attachedViewModel is not null)
268 {
269 _attachedViewModel.OpenLiveTabRequested -= OnOpenLiveTabRequested;
270 _attachedViewModel = null;
271 }
272
273 // WebView2 인스턴스를 명시적으로 정리합니다.
274 // Dispose하지 않으면 Chromium 서브프로세스가 살아남아 앱 종료를 막을 수 있습니다.
275 TryDisposeWebView(ref _wpfLiveWebView);
276 TryDisposeWebView(ref _camerasWebView);
277
278 // WPF Shutdown을 명시적으로 트리거합니다.
279 // host.RunDreamineWpfApp의 구현에 따라 자동 종료가 안 될 수 있으므로 안전망입니다.
280 Application.Current?.Shutdown();
281 }

다음을 참조함 : _attachedViewModel, _camerasWebView, _wpfLiveWebView, OnOpenLiveTabRequested(), TryDisposeWebView().

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

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

◆ OnDataContextChanged()

void DreamineVMS.Views.MainWindow.OnDataContextChanged ( object sender,
DependencyPropertyChangedEventArgs e )
inlineprivate

Data Context Changed 이벤트 또는 상태 변경을 처리합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

MainWindow.xaml.cs 파일의 148 번째 라인에서 정의되었습니다.

149 {
150 if (_attachedViewModel is not null)
151 {
152 _attachedViewModel.OpenLiveTabRequested -= OnOpenLiveTabRequested;
153 _attachedViewModel = null;
154 }
155
156 if (DataContext is MainWindowViewModel viewModel)
157 {
158 _attachedViewModel = viewModel;
159 _attachedViewModel.OpenLiveTabRequested += OnOpenLiveTabRequested;
160 }
161 }

다음을 참조함 : _attachedViewModel, OnOpenLiveTabRequested().

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

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

◆ OnLoaded()

async void DreamineVMS.Views.MainWindow.OnLoaded ( object sender,
RoutedEventArgs e )
inlineprivate

Loaded 이벤트 또는 상태 변경을 처리합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

MainWindow.xaml.cs 파일의 223 번째 라인에서 정의되었습니다.

224 {
225 HybridHostControl embeddedDashboard = new()
226 {
227 HostPage = "wwwroot/index.html",
228 Services = App.ServiceProvider,
229 RootComponentType = typeof(VmsLocalDashboard),
230 RootSelector = "#app"
231 };
232
233 EmbeddedDashboardTab.Content = embeddedDashboard;
234
235 // Live WebView는 동시에 두 개를 바로 띄우지 않습니다.
236 // 두 Live 탭이 동시에 /live에 접속하면 Blazor Circuit과 hls.js player가 중복 생성되어
237 // StopAll → StartAll 이후 source/session 동기화가 꼬일 수 있습니다.
238 await EnsureSelectedLiveWebViewAsync().ConfigureAwait(true);
239 }

다음을 참조함 : EnsureSelectedLiveWebViewAsync(), DreamineVMS.App.ServiceProvider.

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

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

◆ OnMainTabSelectionChanged()

async void DreamineVMS.Views.MainWindow.OnMainTabSelectionChanged ( object sender,
System.Windows.Controls.SelectionChangedEventArgs e )
inlineprivate

Main Tab Selection Changed 이벤트 또는 상태 변경을 처리합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

MainWindow.xaml.cs 파일의 307 번째 라인에서 정의되었습니다.

308 {
309 if (!IsLoaded) return;
310
311 // 에이전트 설정 탭이 처음 열릴 때 PasswordBox에 저장된 비밀번호를 채워줍니다.
312 // PasswordBox.Password는 DependencyProperty가 아니라 직접 바인딩이 불가능합니다.
313 if (AgentPasswordBox is not null
314 && DataContext is MainWindowViewModel vm
315 && string.IsNullOrEmpty(AgentPasswordBox.Password)
316 && !string.IsNullOrEmpty(vm.AgentSettings.Password))
317 {
318 AgentPasswordBox.Password = vm.AgentSettings.Password;
319 }
320
321 await EnsureSelectedLiveWebViewAsync().ConfigureAwait(true);
322 }

다음을 참조함 : EnsureSelectedLiveWebViewAsync().

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

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

◆ OnOpenLiveTabRequested()

void DreamineVMS.Views.MainWindow.OnOpenLiveTabRequested ( object? sender,
EventArgs e )
inlineprivate

Open Live Tab Requested 이벤트 또는 상태 변경을 처리합니다.

매개변수
sender이벤트를 발생시킨 객체입니다.
e이벤트와 관련된 데이터를 포함합니다.

MainWindow.xaml.cs 파일의 187 번째 라인에서 정의되었습니다.

188 {
189 // 레거시 메시지 호환용입니다. Blazor Server의 첫 화면은 Live View이며, 탭 전환은 수행하지 않습니다.
190 Dispatcher.Invoke(() =>
191 {
192 if (!IsActive)
193 {
194 Activate();
195 }
196 });
197 }

다음에 의해서 참조됨 : OnClosed(), OnDataContextChanged().

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

◆ RegisterWebViewRecovery()

void DreamineVMS.Views.MainWindow.RegisterWebViewRecovery ( WebView2 webView,
Func< string > urlFactory )
inlineprivate

Register Web View Recovery 작업을 수행합니다.

매개변수
webViewweb View에 사용할 WebView2 값입니다.
urlFactoryurl Factory에 사용할 Func<string> 값입니다.

MainWindow.xaml.cs 파일의 495 번째 라인에서 정의되었습니다.

496 {
497 webView.CoreWebView2InitializationCompleted += (_, e) =>
498 {
499 if (!e.IsSuccess || webView.CoreWebView2 is null)
500 {
501 Debug.WriteLine($"[DreamineVMS] WebView2 initialization failed: {e.InitializationException}");
502 return;
503 }
504
505 webView.CoreWebView2.ProcessFailed += async (_, args) =>
506 {
507 Debug.WriteLine($"[DreamineVMS] WebView2 process failed: {args.ProcessFailedKind}. Reloading...");
508
509 await Dispatcher.InvokeAsync(async () =>
510 {
511 await Task.Delay(1000).ConfigureAwait(true);
512 TryNavigateWebView(webView, urlFactory());
513 });
514 };
515 };
516
517 webView.NavigationCompleted += (_, e) =>
518 {
519 if (e.IsSuccess)
520 {
521 return;
522 }
523
524 Debug.WriteLine($"[DreamineVMS] WebView2 navigation failed: {e.WebErrorStatus}. Reloading...");
525 Dispatcher.InvokeAsync(async () =>
526 {
527 await Task.Delay(1500).ConfigureAwait(true);
528 TryNavigateWebView(webView, urlFactory());
529 });
530 };
531 }

다음을 참조함 : TryNavigateWebView().

다음에 의해서 참조됨 : EnsureCamerasWebViewAsync(), EnsureWpfLiveWebViewAsync().

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

◆ TryDisposeWebView()

void DreamineVMS.Views.MainWindow.TryDisposeWebView ( ref WebView2? webView)
inlinestaticprivate

Dispose Web View 작업을 시도하고 성공 여부를 반환합니다.

매개변수
webViewweb View에 사용할 WebView2? 값입니다.

MainWindow.xaml.cs 파일의 585 번째 라인에서 정의되었습니다.

586 {
587 if (webView is null)
588 {
589 return;
590 }
591
592 try
593 {
594 webView.Dispose();
595 }
596 catch (Exception ex)
597 {
598 Debug.WriteLine($"[DreamineVMS] WebView2 dispose failed: {ex}");
599 }
600
601 webView = null;
602 }

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

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

◆ TryNavigateWebView()

void DreamineVMS.Views.MainWindow.TryNavigateWebView ( WebView2 webView,
string url )
inlinestaticprivate

Navigate Web View 작업을 시도하고 성공 여부를 반환합니다.

매개변수
webViewweb View에 사용할 WebView2 값입니다.
urlurl에 사용할 string 값입니다.

MainWindow.xaml.cs 파일의 557 번째 라인에서 정의되었습니다.

558 {
559 try
560 {
561 webView.Source = new Uri(url);
562 }
563 catch (Exception ex)
564 {
565 Debug.WriteLine($"[DreamineVMS] WebView2 recovery navigation failed: {ex}");
566 }
567 }

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

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

멤버 데이터 문서화

◆ _attachedViewModel

MainWindowViewModel? DreamineVMS.Views.MainWindow._attachedViewModel
private

attached View Model 값을 보관합니다.

MainWindow.xaml.cs 파일의 46 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : OnClosed(), OnDataContextChanged().

◆ _camerasInitialized

bool DreamineVMS.Views.MainWindow._camerasInitialized
private

cameras Initialized 값을 보관합니다.

MainWindow.xaml.cs 파일의 82 번째 라인에서 정의되었습니다.

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

◆ _camerasWebView

WebView2? DreamineVMS.Views.MainWindow._camerasWebView
private

cameras Web View 값을 보관합니다.

MainWindow.xaml.cs 파일의 64 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : EnsureCamerasWebViewAsync(), OnClosed().

◆ _serverOptions

readonly VmsServerOptions DreamineVMS.Views.MainWindow._serverOptions
private

server Options 값을 보관합니다.

MainWindow.xaml.cs 파일의 37 번째 라인에서 정의되었습니다.

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

◆ _wpfLiveInitialized

bool DreamineVMS.Views.MainWindow._wpfLiveInitialized
private

wpf Live Initialized 값을 보관합니다.

MainWindow.xaml.cs 파일의 73 번째 라인에서 정의되었습니다.

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

◆ _wpfLiveWebView

WebView2? DreamineVMS.Views.MainWindow._wpfLiveWebView
private

wpf Live Web View 값을 보관합니다.

MainWindow.xaml.cs 파일의 55 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : EnsureWpfLiveWebViewAsync(), OnClosed().


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