Fake camera implemented to run it without real camera

This commit is contained in:
iTob 2025-02-16 15:08:25 +01:00
parent 186cab1255
commit 549fcdaabf
216 changed files with 1699 additions and 64 deletions

View File

@ -5,6 +5,10 @@ using CamBooth.App.Core.Logging;
using CamBooth.App.Features.Camera; using CamBooth.App.Features.Camera;
using CamBooth.App.Features.PictureGallery; using CamBooth.App.Features.PictureGallery;
using EDSDKLib.API.Base;
using EOSDigital.API;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace CamBooth.App; namespace CamBooth.App;
@ -38,5 +42,14 @@ public partial class App : Application
services.AddSingleton<AppSettingsService>(); services.AddSingleton<AppSettingsService>();
services.AddSingleton<PictureGalleryService>(); services.AddSingleton<PictureGalleryService>();
services.AddSingleton<CameraService>(); services.AddSingleton<CameraService>();
#if DEBUG
services.AddSingleton<ICanonAPI, CanonAPIMock>();
services.AddSingleton<ICamera, CameraMock>();
#else
services.AddSingleton<ICanonAPI, CanonAPI>();
services.AddSingleton<ICamera, Camera>();
#endif
} }
} }

View File

@ -18,13 +18,13 @@ public class CameraService : IDisposable
private readonly PictureGalleryService _pictureGalleryService; private readonly PictureGalleryService _pictureGalleryService;
private readonly CanonAPI APIHandler; private readonly ICanonAPI _APIHandler;
private CameraValue[] AvList; private CameraValue[] AvList;
private int BulbTime = 30; private int BulbTime = 30;
private List<EOSDigital.API.Camera> CamList; private List<ICamera> CamList;
private int ErrCount; private int ErrCount;
@ -34,19 +34,24 @@ public class CameraService : IDisposable
private CameraValue[] ISOList; private CameraValue[] ISOList;
public EOSDigital.API.Camera MainCamera; public ICamera _mainCamera;
private CameraValue[] TvList; private CameraValue[] TvList;
public CameraService(Logger logger, AppSettingsService appSettings, PictureGalleryService pictureGalleryService) public CameraService(Logger logger,
AppSettingsService appSettings,
PictureGalleryService pictureGalleryService,
ICamera mainCamera,
ICanonAPI APIHandler)
{ {
this._logger = logger; this._logger = logger;
this._appSettings = appSettings; this._appSettings = appSettings;
this._pictureGalleryService = pictureGalleryService; this._pictureGalleryService = pictureGalleryService;
this._mainCamera = mainCamera;
this._APIHandler = APIHandler;
try try
{ {
this.APIHandler = new CanonAPI();
this.IsInit = true; this.IsInit = true;
} }
catch (DllNotFoundException) catch (DllNotFoundException)
@ -65,8 +70,8 @@ public class CameraService : IDisposable
{ {
this.CloseSession(); this.CloseSession();
this.IsInit = false; this.IsInit = false;
this.APIHandler.Dispose(); this._APIHandler.Dispose();
this.MainCamera.Dispose(); this._mainCamera.Dispose();
} }
@ -76,7 +81,7 @@ public class CameraService : IDisposable
ErrorHandler.NonSevereErrorHappened += this.ErrorHandler_NonSevereErrorHappened; ErrorHandler.NonSevereErrorHappened += this.ErrorHandler_NonSevereErrorHappened;
this.RefreshCamera(); this.RefreshCamera();
List<EOSDigital.API.Camera> cameraList = this.APIHandler.GetCameraList(); List<ICamera> cameraList = this._APIHandler.GetCameraList();
if (cameraList.Any()) if (cameraList.Any())
{ {
this.OpenSession(); this.OpenSession();
@ -91,14 +96,14 @@ public class CameraService : IDisposable
private void SetSettingSaveToComputer() private void SetSettingSaveToComputer()
{ {
this.MainCamera.SetSetting(PropertyID.SaveTo, (int)SaveTo.Host); this._mainCamera.SetSetting(PropertyID.SaveTo, (int)SaveTo.Host);
this.MainCamera.SetCapacity(4096, int.MaxValue); this._mainCamera.SetCapacity(4096, int.MaxValue);
} }
public void CloseSession() public void CloseSession()
{ {
this.MainCamera.CloseSession(); this._mainCamera.CloseSession();
// AvCoBox.Items.Clear(); // AvCoBox.Items.Clear();
// TvCoBox.Items.Clear(); // TvCoBox.Items.Clear();
@ -114,34 +119,34 @@ public class CameraService : IDisposable
private void RefreshCamera() private void RefreshCamera()
{ {
// CameraListBox.Items.Clear(); // CameraListBox.Items.Clear();
this.CamList = this.APIHandler.GetCameraList(); this.CamList = this._APIHandler.GetCameraList();
// foreach (Camera cam in CamList) CameraListBox.Items.Add(cam.DeviceName); // foreach (Camera cam in CamList) CameraListBox.Items.Add(cam.DeviceName);
// if (MainCamera?.SessionOpen == true) CameraListBox.SelectedIndex = CamList.FindIndex(t => t.ID == MainCamera.ID); // if (_mainCamera?.SessionOpen == true) CameraListBox.SelectedIndex = CamList.FindIndex(t => t.ID == _mainCamera.ID);
// else if (CamList.Count > 0) CameraListBox.SelectedIndex = 0; // else if (CamList.Count > 0) CameraListBox.SelectedIndex = 0;
} }
private void OpenSession() private void OpenSession()
{ {
this.MainCamera = this.CamList[0]; this._mainCamera = this.CamList[0];
this.MainCamera.OpenSession(); this._mainCamera.OpenSession();
//MainCamera.ProgressChanged += MainCamera_ProgressChanged; //_mainCamera.ProgressChanged += MainCamera_ProgressChanged;
this.MainCamera.StateChanged += this.MainCamera_StateChanged; this._mainCamera.StateChanged += this.MainCamera_StateChanged;
this.MainCamera.DownloadReady += this.MainCamera_DownloadReady; this._mainCamera.DownloadReady += this.MainCamera_DownloadReady;
//SessionLabel.Content = MainCamera.DeviceName; //SessionLabel.Content = _mainCamera.DeviceName;
this.AvList = this.MainCamera.GetSettingsList(PropertyID.Av); this.AvList = this._mainCamera.GetSettingsList(PropertyID.Av);
this.TvList = this.MainCamera.GetSettingsList(PropertyID.Tv); this.TvList = this._mainCamera.GetSettingsList(PropertyID.Tv);
this.ISOList = this.MainCamera.GetSettingsList(PropertyID.ISO); this.ISOList = this._mainCamera.GetSettingsList(PropertyID.ISO);
// foreach (var Av in AvList) AvCoBox.Items.Add(Av.StringValue); // foreach (var Av in AvList) AvCoBox.Items.Add(Av.StringValue);
// foreach (var Tv in TvList) TvCoBox.Items.Add(Tv.StringValue); // foreach (var Tv in TvList) TvCoBox.Items.Add(Tv.StringValue);
// foreach (var ISO in ISOList) ISOCoBox.Items.Add(ISO.StringValue); // foreach (var ISO in ISOList) ISOCoBox.Items.Add(ISO.StringValue);
// AvCoBox.SelectedIndex = AvCoBox.Items.IndexOf(AvValues.GetValue(MainCamera.GetInt32Setting(PropertyID.Av)).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); // TvCoBox.SelectedIndex = TvCoBox.Items.IndexOf(TvValues.GetValue(_mainCamera.GetInt32Setting(PropertyID.Tv)).StringValue);
// ISOCoBox.SelectedIndex = ISOCoBox.Items.IndexOf(ISOValues.GetValue(MainCamera.GetInt32Setting(PropertyID.ISO)).StringValue); // ISOCoBox.SelectedIndex = ISOCoBox.Items.IndexOf(ISOValues.GetValue(_mainCamera.GetInt32Setting(PropertyID.ISO)).StringValue);
// SettingsGroupBox.IsEnabled = true; // SettingsGroupBox.IsEnabled = true;
// LiveViewGroupBox.IsEnabled = true; // LiveViewGroupBox.IsEnabled = true;
} }
@ -157,13 +162,13 @@ public class CameraService : IDisposable
{ {
try try
{ {
if (!this.MainCamera.IsLiveViewOn) if (!this._mainCamera.IsLiveViewOn)
{ {
this.MainCamera.StartLiveView(); this._mainCamera.StartLiveView();
} }
else else
{ {
this.MainCamera.StopLiveView(); this._mainCamera.StopLiveView();
//LVCanvas.Background = Brushes.LightGray; //LVCanvas.Background = Brushes.LightGray;
} }
@ -179,7 +184,7 @@ public class CameraService : IDisposable
{ {
try try
{ {
this.MainCamera.TakePhoto(); this._mainCamera.TakePhoto();
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -256,15 +261,14 @@ public class CameraService : IDisposable
// } // }
private void MainCamera_DownloadReady(EOSDigital.API.Camera sender, DownloadInfo Info) private void MainCamera_DownloadReady(ICamera sender, IDownloadInfo Info)
{ {
this._logger.Info("MainCamera_DownloadReady called"); this._logger.Info("MainCamera_DownloadReady called");
try try
{ {
string dir = this._appSettings.PictureLocation;
Info.FileName = $"img_{Guid.NewGuid().ToString()}.jpg"; Info.FileName = $"img_{Guid.NewGuid().ToString()}.jpg";
sender.DownloadFile(Info, dir); sender.DownloadFile(Info, this._appSettings.PictureLocation);
this._logger.Info("Download complete: " + Path.Combine(dir, Info.FileName)); this._logger.Info("Download complete: " + Path.Combine(this._appSettings.PictureLocation, Info.FileName));
Application.Current.Dispatcher.Invoke(() => { this._pictureGalleryService.LoadThumbnailsToCache(); }); Application.Current.Dispatcher.Invoke(() => { this._pictureGalleryService.LoadThumbnailsToCache(); });
} }
catch (Exception ex) catch (Exception ex)

View File

@ -8,6 +8,8 @@ using CamBooth.App.Core.AppSettings;
using CamBooth.App.Core.Logging; using CamBooth.App.Core.Logging;
using CamBooth.App.Features.Camera; using CamBooth.App.Features.Camera;
using EOSDigital.API;
namespace CamBooth.App.Features.LiveView; namespace CamBooth.App.Features.LiveView;
public partial class LiveViewPage : Page public partial class LiveViewPage : Page
@ -32,25 +34,23 @@ public partial class LiveViewPage : Page
this.SetImageAction = img => { this.bgbrush.ImageSource = img; }; this.SetImageAction = img => { this.bgbrush.ImageSource = img; };
this.LVCanvas.Background = this.bgbrush; this.LVCanvas.Background = this.bgbrush;
cameraService.ConnectCamera(); cameraService.ConnectCamera();
cameraService.MainCamera.LiveViewUpdated += this.MainCamera_OnLiveViewUpdated; cameraService._mainCamera.LiveViewUpdated += this.MainCamera_OnLiveViewUpdated;
} }
private void MainCamera_OnLiveViewUpdated(EOSDigital.API.Camera sender, Stream img) private void MainCamera_OnLiveViewUpdated(ICamera sender, Stream img)
{ {
try try
{ {
using (WrapStream s = new(img)) using WrapStream s = new(img);
{ img.Position = 0;
img.Position = 0; BitmapImage EvfImage = new();
BitmapImage EvfImage = new(); EvfImage.BeginInit();
EvfImage.BeginInit(); EvfImage.StreamSource = s;
EvfImage.StreamSource = s; EvfImage.CacheOption = BitmapCacheOption.OnLoad;
EvfImage.CacheOption = BitmapCacheOption.OnLoad; EvfImage.EndInit();
EvfImage.EndInit(); EvfImage.Freeze();
EvfImage.Freeze(); Application.Current.Dispatcher.BeginInvoke(this.SetImageAction, EvfImage);
Application.Current.Dispatcher.BeginInvoke(this.SetImageAction, EvfImage);
}
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@ -59,7 +59,7 @@ public partial class MainWindow : Window
catch (Exception exception) catch (Exception exception)
{ {
//TODO: mit content dialog ersetzen //TODO: mit content dialog ersetzen
System.Windows.MessageBox.Show("Sorry, da ging was schief!"); System.Windows.MessageBox.Show("Sorry, da ging was schief! Bitte nochmal probieren.");
this._logger.Info(exception.Message); this._logger.Info(exception.Message);
} }
finally finally
@ -122,7 +122,11 @@ public partial class MainWindow : Window
{ {
try try
{ {
TimerControlRectangleAnimation.StartTimer(5); #if DEBUG
TimerControlRectangleAnimation.StartTimer(1);
#else
TimerControlRectangleAnimation.StartTimer(5);
#endif
SwitchButtonAndTimerPanel(); SwitchButtonAndTimerPanel();
} }
catch (Exception exception) catch (Exception exception)

View File

@ -12,6 +12,13 @@
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventRoute_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_003F4bda76b5cc453e1edf5d5c754c4a8215edbd3d3e4f80706dcf4f52a4f68979_003FEventRoute_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AEventRoute_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_003F4bda76b5cc453e1edf5d5c754c4a8215edbd3d3e4f80706dcf4f52a4f68979_003FEventRoute_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_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_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_003AExecutionContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1715f899dd6e4344b571806281c3955fbf38a0_003F93_003F16e712b7_003FExecutionContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AIntPtr_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003F_002E_002E_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fb18a8b3398e74bca86895881dd02956c573648_003F7a_003F52dc840d_003FIntPtr_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATimerElapsedEventArgs_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_003F84fc76ffb0d44a0784938f79e15bb37217928_003F20_003Fb02e4ce4_003FTimerElapsedEventArgs_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> <s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ATimerElapsedEventArgs_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_003F84fc76ffb0d44a0784938f79e15bb37217928_003F20_003Fb02e4ce4_003FTimerElapsedEventArgs_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_003FUsers_003Ftobia_003FAppData_003FRoaming_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F29144f8ea0074c8f96e495ebaf88a2cce798a0_003Fa3_003Fddb8103c_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_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_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> <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>
<s:String x:Key="/Default/CodeInspection/Highlighting/AnalysisEnabled/@EntryValue">SOLUTION</s:String>
<s:String x:Key="/Default/Environment/AssemblyExplorer/XmlDocument/@EntryValue">&lt;AssemblyExplorer&gt;&#xD;
&lt;Assembly Path="C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8.1\System.Drawing.dll" /&gt;&#xD;
&lt;/AssemblyExplorer&gt;</s:String></wpf:ResourceDictionary>

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Some files were not shown because too many files have changed in this diff Show More