LGES-OC5-PtoP-Welder/AuroraVision/VisionUI/Camera/MainCameraViewWindow.xaml.cs
2026-06-05 13:44:39 +09:00

99 lines
3.4 KiB
C#

using Aurora.Api;
using System;
using System.Windows;
using System.ComponentModel;
using System.Windows.Threading;
using VisionCommon;
namespace VisionUI.Camera {
/// <summary>
/// 메인 카메라 뷰 윈도우
/// MainCameraViewWindow.xaml BehindCode
/// </summary>
public partial class MainCameraViewWindow : Window {
private static Logger _Logger = new Logger("MainCameraViewWindow");
private IDisposable _EventDisposable;
/// <summary>Static 객체(싱글톤)</summary>
public static MainCameraViewWindow _Instance = null;
private static readonly object _Lock = new object();
private bool _IsViewInitialized = false;
private eDisplayType _displayType = eDisplayType.Main_1;
private delegate void HideWindow();
/// <summary>
/// 싱글톤 객체
/// </summary>
public static MainCameraViewWindow Instance {
get {
lock (_Lock) {
if (_Instance == null) {
_Instance = new MainCameraViewWindow();
}
return _Instance;
}
}
}
/// <summary>
/// 생성자
/// </summary>
public MainCameraViewWindow() {
_Instance = this;
InitializeComponent();
CreateView();
SetObservable();
}
private void SetObservable() {
if (_EventDisposable == null) {
var observable = VisionEventId.GetRecipeActivatedObservable();
_EventDisposable = observable.Subscribe(_ => UpdateView());
}
}
private void UpdateView()
{
Application.Current.Dispatcher.BeginInvoke((Action)(() => {
var camWindow = MainCameraViewManager.Instance.GetMainCameraView(_displayType);
// 지속적인 메모리 증가로 인하여 방어코드 생성 - from.MagnetAttch 과제
if (!gridMainCameraViewWindow.Children.Contains(camWindow))
{
MainCameraViewManager.Instance.DisposeMainCameraView(_displayType);
gridMainCameraViewWindow.Children.Clear();
gridMainCameraViewWindow.Children.Add(camWindow);
}
}));
}
/// <summary>
/// 카메라 뷰 생성
/// CameraView를 미리 만들어 놓기 위해 프로그램 로딩시 수행
/// </summary>
public void CreateView() {
Application.Current.Dispatcher.BeginInvoke((Action)(() => {
if (!_IsViewInitialized) {
gridMainCameraViewWindow.Children.Add(MainCameraViewManager.Instance.GetMainCameraView(_displayType));
_IsViewInitialized = true;
}
}));
}
protected override void OnClosing(CancelEventArgs e) {
// Aurora 앱이 닫힌 후에도 해당 팝업이 강제종료될때까지 살아있어, 명시적으로 꺼질 수 있게끔 예외처리코드 추가
if (Application.Current.MainWindow != null)
{
e.Cancel = true;
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new HideWindow(_HideWindow));
}
}
private void _HideWindow() {
CameraUcManager.Instance.StopLiveAll();
this.Hide();
}
}
}