This commit is contained in:
Tobias Wohlleben 2025-01-20 12:13:51 +01:00
parent c3b3d3e673
commit e0ebb25f17
8 changed files with 390 additions and 292 deletions

View File

@ -4,6 +4,7 @@ using System.Data;
using System.Windows;
using CamBooth.App.Core.AppSettings;
using CamBooth.App.Core.Camera;
using CamBooth.App.Core.Logging;
using CamBooth.App.DebugConsole;
using CamBooth.App.LiveView;
@ -41,5 +42,6 @@ public partial class App : Application
services.AddSingleton<Logger>();
services.AddSingleton<AppSettingsService>();
services.AddSingleton<PictureGalleryService>();
services.AddSingleton<CameraService>();
}
}

View File

@ -0,0 +1,316 @@
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
using CamBooth.App.Core.AppSettings;
using CamBooth.App.Core.Logging;
using CamBooth.App.LiveView;
using CamBooth.App.PictureGallery;
using EOSDigital.API;
using EOSDigital.SDK;
namespace CamBooth.App.Core.Camera;
public class CameraService : IDisposable
{
private readonly Logger _logger;
private readonly AppSettingsService _appSettings;
private readonly PictureGalleryService _pictureGalleryService;
CanonAPI APIHandler;
public EOSDigital.API.Camera MainCamera;
bool IsInit = false;
List<EOSDigital.API.Camera> CamList;
CameraValue[] AvList;
CameraValue[] TvList;
CameraValue[] ISOList;
int BulbTime = 30;
int ErrCount;
object ErrLock = new object();
public CameraService(Logger logger, AppSettingsService appSettings, PictureGalleryService pictureGalleryService)
{
this._logger = logger;
this._appSettings = appSettings;
this._pictureGalleryService = pictureGalleryService;
try
{
APIHandler = new CanonAPI();
IsInit = true;
}
catch (DllNotFoundException)
{
ReportError("Canon DLLs not found!", true);
}
catch (Exception ex)
{
ReportError(ex.Message, true);
}
}
public void ConnectCamera()
{
ErrorHandler.SevereErrorHappened += ErrorHandler_SevereErrorHappened;
ErrorHandler.NonSevereErrorHappened += ErrorHandler_NonSevereErrorHappened;
RefreshCamera();
List<EOSDigital.API.Camera> cameraList = this.APIHandler.GetCameraList();
if (cameraList.Any())
{
this.OpenSession();
this.SetSettingSaveToComputer();
this.StarLiveView();
}
string cameraDeviceNames = string.Join(", ", cameraList.Select(cam => cam.DeviceName));
_logger.Info(cameraDeviceNames == string.Empty ? "No cameras / devices found" : cameraDeviceNames);
}
private void SetSettingSaveToComputer()
{
MainCamera.SetSetting(PropertyID.SaveTo, (int)SaveTo.Host);
MainCamera.SetCapacity(4096, int.MaxValue);
}
public void CloseSession()
{
MainCamera.CloseSession();
// AvCoBox.Items.Clear();
// TvCoBox.Items.Clear();
// ISOCoBox.Items.Clear();
// SettingsGroupBox.IsEnabled = false;
// LiveViewGroupBox.IsEnabled = false;
// SessionButton.Content = "Open Session";
// SessionLabel.Content = "No open session";
// StarLVButton.Content = "Start LV";
}
private void RefreshCamera()
{
// CameraListBox.Items.Clear();
CamList = APIHandler.GetCameraList();
// foreach (Camera cam in CamList) CameraListBox.Items.Add(cam.DeviceName);
// if (MainCamera?.SessionOpen == true) CameraListBox.SelectedIndex = CamList.FindIndex(t => t.ID == MainCamera.ID);
// else if (CamList.Count > 0) CameraListBox.SelectedIndex = 0;
}
private void OpenSession()
{
MainCamera = CamList[0];
MainCamera.OpenSession();
//MainCamera.ProgressChanged += MainCamera_ProgressChanged;
MainCamera.StateChanged += MainCamera_StateChanged;
MainCamera.DownloadReady += MainCamera_DownloadReady;
//SessionLabel.Content = MainCamera.DeviceName;
AvList = MainCamera.GetSettingsList(PropertyID.Av);
TvList = MainCamera.GetSettingsList(PropertyID.Tv);
ISOList = MainCamera.GetSettingsList(PropertyID.ISO);
// foreach (var Av in AvList) AvCoBox.Items.Add(Av.StringValue);
// foreach (var Tv in TvList) TvCoBox.Items.Add(Tv.StringValue);
// foreach (var ISO in ISOList) ISOCoBox.Items.Add(ISO.StringValue);
// AvCoBox.SelectedIndex = AvCoBox.Items.IndexOf(AvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Av)).StringValue);
// TvCoBox.SelectedIndex = TvCoBox.Items.IndexOf(TvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Tv)).StringValue);
// ISOCoBox.SelectedIndex = ISOCoBox.Items.IndexOf(ISOValues.GetValue(MainCamera.GetInt32Setting(PropertyID.ISO)).StringValue);
// SettingsGroupBox.IsEnabled = true;
// LiveViewGroupBox.IsEnabled = true;
}
private void ReportError(string message, bool lockdown)
{
int errc;
lock (ErrLock)
{
errc = ++ErrCount;
}
if (lockdown)
{
//this.EnableUI(false);
}
switch (errc)
{
case < 4:
this._logger.Info(message);
break;
case 4:
this._logger.Info("Many errors happened!");
break;
}
lock (ErrLock)
{
ErrCount--;
}
}
private void StarLiveView()
{
try
{
if (!MainCamera.IsLiveViewOn)
{
MainCamera.StartLiveView();
}
else
{
MainCamera.StopLiveView();
//LVCanvas.Background = Brushes.LightGray;
}
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
#region API Events
// private void APIHandler_CameraAdded(CanonAPI sender)
// {
// try
// {
// }
// catch (Exception ex)
// {
// ReportError(ex.Message, false);
// }
// }
private void MainCamera_StateChanged(EOSDigital.API.Camera sender, StateEventID eventID, int parameter)
{
try
{
if (eventID == StateEventID.Shutdown && IsInit)
{
Application.Current.Dispatcher.Invoke(() => this.CloseSession());
//Dispatcher.Invoke((Action)delegate { CloseSession(); });
}
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
// private void MainCamera_ProgressChanged(object sender, int progress)
// {
// try
// {
// //MainProgressBar.Dispatcher.Invoke((Action)delegate { MainProgressBar.Value = progress; });
// }
// catch (Exception ex)
// {
// ReportError(ex.Message, false);
// }
// }
// private void MainCamera_LiveViewUpdated(EOSDigital.API.Camera sender, Stream img)
// {
// try
// {
// using (WrapStream s = new WrapStream(img))
// {
// img.Position = 0;
// BitmapImage EvfImage = new BitmapImage();
// EvfImage.BeginInit();
// EvfImage.StreamSource = s;
// EvfImage.CacheOption = BitmapCacheOption.OnLoad;
// EvfImage.EndInit();
// EvfImage.Freeze();
// Application.Current.Dispatcher.BeginInvoke(SetImageAction, EvfImage);
// }
// }
// catch (Exception ex)
// {
// ReportError(ex.Message, false);
// }
// }
private void MainCamera_DownloadReady(EOSDigital.API.Camera sender, DownloadInfo Info)
{
this._logger.Info("MainCamera_DownloadReady called");
try
{
string dir = this._appSettings.PictureLocation;
Info.FileName = $"img_{Guid.NewGuid().ToString()}.jpg";
sender.DownloadFile(Info, dir);
this._logger.Info("Download complete: " + Path.Combine(dir, Info.FileName));
Application.Current.Dispatcher.Invoke(() => { this._pictureGalleryService.LoadThumbnailsToCache(); });
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
private void ErrorHandler_NonSevereErrorHappened(object sender, ErrorCode ex)
{
ReportError($"SDK Error code: {ex} ({((int)ex).ToString("X")})", false);
}
private void ErrorHandler_SevereErrorHappened(object sender, Exception ex)
{
ReportError(ex.Message, true);
}
#endregion
public void TakePhoto()
{
try
{
MainCamera.TakePhotoAsync();
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
/// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
public void Dispose()
{
this.CloseSession();
IsInit = false;
this.APIHandler.Dispose();
this.MainCamera.Dispose();
}
}

View File

@ -7,6 +7,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using CamBooth.App.Core.AppSettings;
using CamBooth.App.Core.Camera;
using CamBooth.App.Core.Logging;
using EOSDigital.API;
@ -20,218 +21,26 @@ public partial class LiveViewPage : Page
private readonly AppSettingsService _appSettings;
CanonAPI APIHandler;
Camera MainCamera;
CameraValue[] AvList;
CameraValue[] TvList;
CameraValue[] ISOList;
List<Camera> CamList;
bool IsInit = false;
int BulbTime = 30;
ImageBrush bgbrush = new ImageBrush();
private readonly CameraService _cameraService;
Action<BitmapImage> SetImageAction;
int ErrCount;
private ImageBrush bgbrush = new ImageBrush();
object ErrLock = new object();
public LiveViewPage(Logger logger, AppSettingsService appSettings)
public LiveViewPage(Logger logger, AppSettingsService appSettings, CameraService cameraService)
{
this._logger = logger;
this._appSettings = appSettings;
try
{
InitializeComponent();
APIHandler = new CanonAPI();
ErrorHandler.SevereErrorHappened += ErrorHandler_SevereErrorHappened;
ErrorHandler.NonSevereErrorHappened += ErrorHandler_NonSevereErrorHappened;
//SavePathTextBox.Text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "RemotePhoto");
SetImageAction = (BitmapImage img) => { bgbrush.ImageSource = img; };
RefreshCamera();
IsInit = true;
List<Camera> cameraList = this.APIHandler.GetCameraList();
if (cameraList.Any())
{
this.OpenSession();
this.StarLiveView();
this.SetSettingSaveToComputer();
}
string cameraDeviceNames = string.Join(", ", cameraList.Select(cam => cam.DeviceName));
logger.Info(cameraDeviceNames == string.Empty ? "No cameras / devices found" : cameraDeviceNames);
}
catch (DllNotFoundException)
{
ReportError("Canon DLLs not found!", true);
}
catch (Exception ex)
{
ReportError(ex.Message, true);
}
}
private void SetSettingSaveToComputer()
{
MainCamera.SetSetting(PropertyID.SaveTo, (int)SaveTo.Host);
MainCamera.SetCapacity(4096, int.MaxValue);
}
public void CloseSession()
{
MainCamera.CloseSession();
// AvCoBox.Items.Clear();
// TvCoBox.Items.Clear();
// ISOCoBox.Items.Clear();
// SettingsGroupBox.IsEnabled = false;
// LiveViewGroupBox.IsEnabled = false;
// SessionButton.Content = "Open Session";
// SessionLabel.Content = "No open session";
// StarLVButton.Content = "Start LV";
this._cameraService = cameraService;
InitializeComponent();
SetImageAction = (BitmapImage img) => { bgbrush.ImageSource = img; };
LVCanvas.Background = bgbrush;
cameraService.ConnectCamera();
cameraService.MainCamera.LiveViewUpdated += MainCamera_OnLiveViewUpdated;
}
private void RefreshCamera()
{
// CameraListBox.Items.Clear();
CamList = APIHandler.GetCameraList();
// foreach (Camera cam in CamList) CameraListBox.Items.Add(cam.DeviceName);
// if (MainCamera?.SessionOpen == true) CameraListBox.SelectedIndex = CamList.FindIndex(t => t.ID == MainCamera.ID);
// else if (CamList.Count > 0) CameraListBox.SelectedIndex = 0;
}
private void OpenSession()
{
MainCamera = CamList[0];
MainCamera.OpenSession();
MainCamera.LiveViewUpdated += MainCamera_LiveViewUpdated;
//MainCamera.ProgressChanged += MainCamera_ProgressChanged;
MainCamera.StateChanged += MainCamera_StateChanged;
MainCamera.DownloadReady += MainCamera_DownloadReady;
//SessionLabel.Content = MainCamera.DeviceName;
AvList = MainCamera.GetSettingsList(PropertyID.Av);
TvList = MainCamera.GetSettingsList(PropertyID.Tv);
ISOList = MainCamera.GetSettingsList(PropertyID.ISO);
// foreach (var Av in AvList) AvCoBox.Items.Add(Av.StringValue);
// foreach (var Tv in TvList) TvCoBox.Items.Add(Tv.StringValue);
// foreach (var ISO in ISOList) ISOCoBox.Items.Add(ISO.StringValue);
// AvCoBox.SelectedIndex = AvCoBox.Items.IndexOf(AvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Av)).StringValue);
// TvCoBox.SelectedIndex = TvCoBox.Items.IndexOf(TvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Tv)).StringValue);
// ISOCoBox.SelectedIndex = ISOCoBox.Items.IndexOf(ISOValues.GetValue(MainCamera.GetInt32Setting(PropertyID.ISO)).StringValue);
// SettingsGroupBox.IsEnabled = true;
// LiveViewGroupBox.IsEnabled = true;
}
private void ReportError(string message, bool lockdown)
{
int errc;
lock (ErrLock)
{
errc = ++ErrCount;
}
if (lockdown)
{
//this.EnableUI(false);
}
switch (errc)
{
case < 4:
this._logger.Info(message);
break;
case 4:
this._logger.Info("Many errors happened!");
break;
}
lock (ErrLock)
{
ErrCount--;
}
}
private void StarLiveView()
{
try
{
if (!MainCamera.IsLiveViewOn)
{
LVCanvas.Background = bgbrush;
MainCamera.StartLiveView();
}
else
{
MainCamera.StopLiveView();
LVCanvas.Background = Brushes.LightGray;
}
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
#region API Events
// private void APIHandler_CameraAdded(CanonAPI sender)
// {
// try
// {
// }
// catch (Exception ex)
// {
// ReportError(ex.Message, false);
// }
// }
private void MainCamera_StateChanged(Camera sender, StateEventID eventID, int parameter)
{
try
{
if (eventID == StateEventID.Shutdown && IsInit)
{
Dispatcher.Invoke((Action)delegate { CloseSession(); });
}
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
// private void MainCamera_ProgressChanged(object sender, int progress)
// {
// try
// {
// //MainProgressBar.Dispatcher.Invoke((Action)delegate { MainProgressBar.Value = progress; });
// }
// catch (Exception ex)
// {
// ReportError(ex.Message, false);
// }
// }
private void MainCamera_LiveViewUpdated(Camera sender, Stream img)
private void MainCamera_OnLiveViewUpdated(Camera sender, Stream img)
{
try
{
@ -249,58 +58,19 @@ public partial class LiveViewPage : Page
}
catch (Exception ex)
{
ReportError(ex.Message, false);
_logger.Error(ex.Message);
}
}
private void MainCamera_DownloadReady(Camera sender, DownloadInfo Info)
{
this._logger.Info("MainCamera_DownloadReady called");
try
{
string dir = this._appSettings.PictureLocation;
sender.DownloadFile(Info, dir);
this._logger.Info("Download complete: " + Path.Combine(dir, Info.FileName));
//MainProgressBar.Dispatcher.Invoke((Action)delegate { MainProgressBar.Value = 0; });
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
}
private void ErrorHandler_NonSevereErrorHappened(object sender, ErrorCode ex)
{
ReportError($"SDK Error code: {ex} ({((int)ex).ToString("X")})", false);
}
private void ErrorHandler_SevereErrorHappened(object sender, Exception ex)
{
ReportError(ex.Message, true);
}
#endregion
public void TakePhoto()
{
try
{
MainCamera.TakePhotoAsync();
}
catch (Exception ex)
{
ReportError(ex.Message, false);
}
this._cameraService.TakePhoto();
}
public void Dispose()
{
this.CloseSession();
IsInit = false;
MainCamera?.Dispose();
APIHandler?.Dispose();
this._cameraService.Dispose();
}
}

View File

@ -3,6 +3,7 @@ using System.Windows;
using System.Windows.Controls;
using CamBooth.App.Core.AppSettings;
using CamBooth.App.Core.Camera;
using CamBooth.App.Core.Logging;
using CamBooth.App.DebugConsole;
using CamBooth.App.LiveView;
@ -21,6 +22,8 @@ public partial class MainWindow : Window
private readonly PictureGalleryService _pictureGalleryService;
private readonly CameraService _cameraService;
private bool _isDebugConsoleVisible = true;
private bool _isPicturePanelVisible = false;
@ -28,11 +31,15 @@ public partial class MainWindow : Window
private LiveViewPage? _liveViewPage;
public MainWindow(Logger logger, AppSettingsService appSettings, PictureGalleryService pictureGalleryService)
public MainWindow(Logger logger,
AppSettingsService appSettings,
PictureGalleryService pictureGalleryService,
CameraService cameraService)
{
this._logger = logger;
this._appSettings = appSettings;
this._pictureGalleryService = pictureGalleryService;
this._cameraService = cameraService;
InitializeComponent();
this.SetVisibilityDebugConsole(this._isDebugConsoleVisible);
this.LoadPicturePanelAsync();
@ -44,9 +51,9 @@ public partial class MainWindow : Window
private void LoadPicturePanelAsync()
{
//this.PicturePanel.Visibility = Visibility.Hidden;
//this.PicturePanel.Navigate(new PicturePanel(this._appSettings, this._logger));
this._pictureGalleryService.LoadThumbnailsToCache(12);
//this.PicturePanelPage.Visibility = Visibility.Hidden;
//this.PicturePanelPage.Navigate(new PicturePanelPage(this._appSettings, this._logger));
this._pictureGalleryService.LoadThumbnailsToCache();
//this.DebugFrame.Navigate(new DebugConsolePage(this._logger));
}
@ -55,7 +62,7 @@ public partial class MainWindow : Window
{
if (visibility)
{
this.PicturePanel.Navigate(new PicturePanel(this._appSettings, this._logger, this._pictureGalleryService));
this.PicturePanel.Navigate(new PicturePanelPage(this._appSettings, this._logger, this._pictureGalleryService));
}
else
{
@ -74,7 +81,7 @@ public partial class MainWindow : Window
private void NavToLiveView(object sender, RoutedEventArgs e)
{
_liveViewPage = new LiveViewPage(this._logger, this._appSettings);
_liveViewPage = new LiveViewPage(this._logger, this._appSettings, this._cameraService);
MainFrame.Navigate(this._liveViewPage);
}

View File

@ -15,22 +15,12 @@ public class PictureGalleryService
private readonly Logger _logger;
public List<Image> ImageControls
{
get
{
// List<Image> tmp = new List<Image>();
// foreach (var image in imageControls)
// {
// tmp.Add(image);
// }
// return tmp;
public List<BitmapImage> ThumbnailsOrderedByNewestDescending => this.thumbnails.
OrderByDescending(map => map.Key)
.Select(ordered => ordered.Value)
.ToList();
return this.imageControls;
}
}
private List<Image> imageControls = new List<Image>();
private Dictionary<DateTime, BitmapImage> thumbnails = new();
public PictureGalleryService(AppSettingsService appSettings, Logger logger)
@ -40,30 +30,32 @@ public class PictureGalleryService
}
public void LoadThumbnailsToCache(int howManyPictures)
public void LoadThumbnailsToCache(int cacheSize = 0)
{
this._logger.Info("Start load thumbnails into cache");
string? pictureLocation = this._appSettings.PictureLocation;
int loop = 0;
var picturePaths = Directory.EnumerateFiles(pictureLocation).ToList();
List<string> picturePaths = Directory.EnumerateFiles(pictureLocation).ToList();
do
{
string picturePath = picturePaths[loop];
this._logger.Info("load image: " + picturePath);
var imageControl = new Wpf.Ui.Controls.Image()
DateTime creationTime = File.GetCreationTime(picturePath);
// add if not exists
if (!this.thumbnails.ContainsKey(creationTime))
{
Source = CreateThumbnail(picturePath, 244, 200),
Width = 386, // Optional: Setze Breite
Margin = new Thickness(3) // Optional: Abstand zwischen Bildern
};
// Füge das Image-Control in ein StackPanel ein
this.imageControls.Add(imageControl);
this.thumbnails.Add(creationTime, CreateThumbnail(picturePath, 244, 200));
this._logger.Info($"Thumbnail '{picturePath}' successfully created");
}
loop++;
}
while (loop < howManyPictures && loop < picturePaths.Count);
while ((loop < cacheSize || cacheSize == 0) && loop < picturePaths.Count);
this._logger.Info("Loading thumbnails into cache completed");
}
public static BitmapImage CreateThumbnail(string filePath, int maxWidth, int maxHeight)
@ -71,7 +63,7 @@ public class PictureGalleryService
var bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.UriSource = new Uri(filePath);
bitmap.DecodePixelWidth = maxWidth; // Größe des Thumbnails direkt beim Dekodieren festlegen
bitmap.DecodePixelWidth = maxWidth; // Größe des ThumbnailsOrderedByNewestDescending direkt beim Dekodieren festlegen
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.EndInit();
return bitmap;

View File

@ -1,11 +1,11 @@
<Page x:Class="CamBooth.App.PictureGallery.PicturePanel"
<Page x:Class="CamBooth.App.PictureGallery.PicturePanelPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CamBooth.App.PictureGallery"
mc:Ignorable="d"
Title="PicturePanel" Width="1600" Height="795"
Title="PicturePanelPage" Width="1600" Height="795"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
Background="Magenta">
<Grid>

View File

@ -10,7 +10,7 @@ using Image = Wpf.Ui.Controls.Image;
namespace CamBooth.App.PictureGallery;
public partial class PicturePanel : Page, IDisposable
public partial class PicturePanelPage : Page, IDisposable
{
private readonly AppSettingsService _appSettingsService;
@ -19,7 +19,7 @@ public partial class PicturePanel : Page, IDisposable
private readonly PictureGalleryService _pictureGalleryService;
public PicturePanel(AppSettingsService appSettingsService, Logger logger, PictureGalleryService pictureGalleryService)
public PicturePanelPage(AppSettingsService appSettingsService, Logger logger, PictureGalleryService pictureGalleryService)
{
this._appSettingsService = appSettingsService;
this._logger = logger;
@ -42,15 +42,25 @@ public partial class PicturePanel : Page, IDisposable
}
private void LoadPictures(int howManyPictures)
private void LoadPictures(int howManyPictures = 0)
{
foreach (Image ctl in this._pictureGalleryService.ImageControls)
int loop = 0;
do
{
if(!this.PicturesPanel.Children.Contains(ctl))
BitmapImage thumbnail = this._pictureGalleryService.ThumbnailsOrderedByNewestDescending[loop];
var imageControl = new Wpf.Ui.Controls.Image()
{
this.PicturesPanel.Children.Add(ctl);
}
Source = thumbnail,
Width = 388,
Margin = new Thickness(3)
};
this.PicturesPanel.Children.Add(imageControl);
loop++;
}
while ((loop < howManyPictures || howManyPictures == 0) && loop < this._pictureGalleryService.ThumbnailsOrderedByNewestDescending.Count);
}

View File

@ -7,6 +7,7 @@
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CDev_005CRepos_005CPrivat_005CCamBooth_005Cmisc_005CCanonBinaries_005CMlib_002Edll/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/AddReferences/RecentPaths/=C_003A_005CDev_005CRepos_005CPrivat_005CCamBooth_005Cmisc_005CCanonBinaries_005CUcs32P_002Edll/@EntryIndexedValue">True</s:Boolean>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AApplication_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003F6665f2e3e843578225e3796b83c5342a58c3f72bfef19eeee7aa90d157d4949_003FApplication_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F793c644a163b4a9992123fa9cc1562efbf3908_003F4a_003Fd28af422_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AExceptionDispatchInfo_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fbd1d5c50194fea68ff3559c160230b0ab50f5acf4ce3061bffd6d62958e2182_003FExceptionDispatchInfo_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F0713c794b56e4feca091d5981a6f5967f60930_003Fc8_003F61b7e802_003FWindow_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AWindow_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fd0db11e55b76dc7f234163f6cee32b297b8ddb591fb0b5cbad1b46ed17343e18_003FWindow_002Ecs_002Fz_003A2_002D1/@EntryIndexedValue">ForceIncluded</s:String></wpf:ResourceDictionary>