1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-12 21:38:38 +00:00

Implemented Ninject, removed AutoFac, updated Caliburn.Micro to v3

This commit is contained in:
Robert Beekman 2016-05-06 23:20:48 +02:00
parent 77fc04d0b6
commit 68efa4885e
14 changed files with 6632 additions and 1362 deletions

View File

@ -120,20 +120,16 @@
</PropertyGroup>
<PropertyGroup />
<ItemGroup>
<Reference Include="Autofac, Version=4.0.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
<HintPath>..\packages\Autofac.4.0.0-rc1-177\lib\net45\Autofac.dll</HintPath>
<Reference Include="Caliburn.Micro, Version=3.0.1.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.Core.3.0.1\lib\net45\Caliburn.Micro.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Caliburn.Micro, Version=2.0.2.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.Core.2.0.2\lib\net45\Caliburn.Micro.dll</HintPath>
<Reference Include="Caliburn.Micro.Platform, Version=3.0.1.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.3.0.1\lib\net45\Caliburn.Micro.Platform.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Caliburn.Micro.Autofac, Version=2.0.9.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.AutofacBootstrap.2.0.9-beta\lib\net40\Caliburn.Micro.Autofac.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Caliburn.Micro.Platform, Version=2.0.2.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.2.0.2\lib\net45\Caliburn.Micro.Platform.dll</HintPath>
<Reference Include="Caliburn.Micro.Platform.Core, Version=3.0.1.0, Culture=neutral, PublicKeyToken=8e5891231f2ed21f, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.3.0.1\lib\net45\Caliburn.Micro.Platform.Core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="ColorBox, Version=1.1.0.0, Culture=neutral, PublicKeyToken=f971124b2576acfc, processorArchitecture=MSIL">
@ -175,8 +171,12 @@
<HintPath>..\packages\Newtonsoft.Json.8.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Ninject, Version=3.2.0.0, Culture=neutral, PublicKeyToken=c7192dc5380945e7, processorArchitecture=MSIL">
<HintPath>..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.3.2\lib\net45\NLog.dll</HintPath>
<HintPath>..\packages\NLog.4.3.3\lib\net45\NLog.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="SharpDX, Version=3.0.2.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
@ -202,7 +202,10 @@
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Caliburn.Micro.3.0.1\lib\net45\System.Windows.Interactivity.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
@ -223,10 +226,6 @@
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="XamlAnimatedGif, Version=1.1.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\XamlAnimatedGif.1.1.2\lib\net45\XamlAnimatedGif.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xceed.Wpf.AvalonDock, Version=2.7.0.0, Culture=neutral, PublicKeyToken=3e4669d2f30244f4, processorArchitecture=MSIL">
<HintPath>..\packages\Extended.Wpf.Toolkit.2.7\lib\net40\Xceed.Wpf.AvalonDock.dll</HintPath>
<Private>True</Private>
@ -286,6 +285,7 @@
<Compile Include="Models\EffectSettings.cs" />
<Compile Include="Models\GameSettings.cs" />
<Compile Include="Models\Interfaces\GameDataModel.cs" />
<Compile Include="Models\OverlaySettings.cs" />
<Compile Include="Models\Profiles\LayerConditionModel.cs" />
<Compile Include="Models\Profiles\LayerModel.cs" />
<Compile Include="Models\Profiles\LayerDynamicPropertiesModel.cs" />
@ -371,6 +371,8 @@
<Compile Include="Modules\Overlays\VolumeDisplay\VolumeDisplaySettings.cs" />
<Compile Include="Modules\Games\RocketLeague\RocketLeagueSettings.cs" />
<Compile Include="Modules\Effects\TypeWave\TypeWaveSettings.cs" />
<Compile Include="NinjectModules\ArtemisModules.cs" />
<Compile Include="NinjectModules\ManagerModules.cs" />
<Compile Include="Properties\Annotations.cs" />
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
@ -414,6 +416,7 @@
<Compile Include="Utilities\StickyValue.cs" />
<Compile Include="Utilities\Updater.cs" />
<Compile Include="Utilities\ValueConverters.cs" />
<Compile Include="ViewModels\Abstract\OverlayViewModel.cs" />
<Compile Include="ViewModels\Abstract\EffectViewModel.cs" />
<Compile Include="ViewModels\Abstract\GameViewModel.cs" />
<Compile Include="ViewModels\EffectsViewModel.cs" />
@ -561,12 +564,12 @@
<Resource Include="Resources\Keyboards\k95.png" />
<Resource Include="Resources\Keyboards\strafe.png" />
<Resource Include="Resources\Keyboards\g910.png" />
<Resource Include="Resources\WindowsIcons-license.txt" />
<Resource Include="Resources\Entypo-license.txt" />
<None Include="Resources\folder.png" />
<None Include="Resources\headset.png" />
<None Include="Resources\mouse.png" />
<None Include="Resources\gif.png" />
<Resource Include="Resources\WindowsIcons-license.txt" />
<Resource Include="Resources\Entypo-license.txt" />
<Content Include="Resources\Witcher3\playerWitcher.txt" />
<Content Include="Resources\Witcher3\artemis.txt" />
<None Include="Settings\Offsets.settings">
@ -594,6 +597,10 @@
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Resources\IconsNonShared.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Styles\Accents\CorsairYellow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>

View File

@ -1,27 +1,33 @@
using System.Diagnostics;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using Artemis.ViewModels;
using Autofac;
using Caliburn.Micro;
using Caliburn.Micro.Autofac;
using Ninject;
using Application = System.Windows.Application;
using MessageBox = System.Windows.Forms.MessageBox;
using MouseEventArgs = System.Windows.Input.MouseEventArgs;
namespace Artemis
{
public class ArtemisBootstrapper : AutofacBootstrapper<SystemTrayViewModel>
public class ArtemisBootstrapper : BootstrapperBase
{
private IKernel _kernel;
public ArtemisBootstrapper()
{
CheckDuplicateInstances();
Initialize();
BindSpecialValues();
}
private void BindSpecialValues()
{
MessageBinder.SpecialValues.Add("$scaledmousex", ctx =>
{
var img = ctx.Source as Image;
@ -64,14 +70,35 @@ namespace Artemis
});
}
protected override void ConfigureContainer(ContainerBuilder builder)
protected override void Configure()
{
base.ConfigureContainer(builder);
_kernel = new StandardKernel();
_kernel.Bind<IWindowManager>().To<WindowManager>().InSingletonScope();
_kernel.Bind<IEventAggregator>().To<EventAggregator>().InSingletonScope();
}
// create a window manager instance to be used by everyone asking for one (including Caliburn.Micro)
builder.RegisterInstance<IWindowManager>(new WindowManager());
builder.RegisterType<SystemTrayViewModel>();
builder.RegisterType<ShellViewModel>();
protected override void OnExit(object sender, EventArgs e)
{
_kernel.Dispose();
base.OnExit(sender, e);
}
protected override object GetInstance(Type service, string key)
{
if (service == null)
throw new ArgumentNullException(nameof(service));
return _kernel.Get(service);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _kernel.GetAll(service);
}
protected override void BuildUp(object instance)
{
_kernel.Inject(instance);
}
protected override void OnStartup(object sender, StartupEventArgs e)

View File

@ -0,0 +1,7 @@
namespace Artemis.Models
{
public abstract class OverlaySettings : EffectSettings
{
public bool Enabled { get; set; }
}
}

View File

@ -3,14 +3,13 @@ using Artemis.Models;
namespace Artemis.Modules.Overlays.VolumeDisplay
{
public class VolumeDisplaySettings : EffectSettings
public class VolumeDisplaySettings : OverlaySettings
{
public VolumeDisplaySettings()
{
Load();
}
public bool Enabled { get; set; }
public Color MainColor { get; set; }
public Color SecondaryColor { get; set; }

View File

@ -30,10 +30,10 @@
</Label>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
<Label Content="Enable overlay" Margin="0 3 0 0" HorizontalAlignment="Right" />
<ToggleButton x:Name="EffectEnabled" Margin="0 3 0 0" Width="25" Height="25"
IsChecked="{Binding Path=VolumeDisplaySettings.Enabled, Mode=TwoWay}"
<ToggleButton x:Name="OverlayEnabled" Margin="0 3 0 0" Width="25" Height="25"
IsChecked="{Binding Path=OverlaySettings.Enabled, Mode=TwoWay}"
Style="{DynamicResource MetroCircleToggleButtonStyle}"
cal:Message.Attach="[Event Click] = [Action ToggleEffect]" />
cal:Message.Attach="[Event Click] = [Action ToggleOverlay]" />
</StackPanel>
</StackPanel>
@ -43,7 +43,7 @@
Main volume display color
</TextBlock>
<xctk:ColorPicker x:Name="MainColor"
SelectedColor="{Binding Path=VolumeDisplaySettings.MainColor, Mode=TwoWay}"
SelectedColor="{Binding Path=OverlaySettings.MainColor, Mode=TwoWay}"
Grid.Row="1" Grid.Column="1" Width="110" HorizontalAlignment="Right"
VerticalAlignment="Center" Margin="0,5,-1,5" Height="22" />
@ -53,7 +53,7 @@
Secondary volume display color
</TextBlock>
<xctk:ColorPicker x:Name="SecondaryColor"
SelectedColor="{Binding Path=VolumeDisplaySettings.SecondaryColor, Mode=TwoWay}"
SelectedColor="{Binding Path=OverlaySettings.SecondaryColor, Mode=TwoWay}"
Grid.Row="2" Grid.Column="1" Width="110" HorizontalAlignment="Right"
VerticalAlignment="Center" Margin="0,5,-1,5" Height="22" />

View File

@ -1,60 +1,20 @@
using Artemis.Managers;
using Caliburn.Micro;
using Artemis.ViewModels.Abstract;
namespace Artemis.Modules.Overlays.VolumeDisplay
{
public class VolumeDisplayViewModel : Screen
public class VolumeDisplayViewModel : OverlayViewModel
{
private VolumeDisplaySettings _volumeDisplaySettings;
public VolumeDisplayViewModel(MainManager mainManager)
{
MainManager = mainManager;
// Settings are loaded from file by class
VolumeDisplaySettings = new VolumeDisplaySettings();
OverlaySettings = new VolumeDisplaySettings();
// Create effect model and add it to MainManager
VolumeDisplayModel = new VolumeDisplayModel(mainManager, VolumeDisplaySettings);
MainManager.EffectManager.EffectModels.Add(VolumeDisplayModel);
}
public static string Name => "Volume Display";
public MainManager MainManager { get; set; }
public VolumeDisplayModel VolumeDisplayModel { get; set; }
public VolumeDisplaySettings VolumeDisplaySettings
{
get { return _volumeDisplaySettings; }
set
{
if (Equals(value, _volumeDisplaySettings)) return;
_volumeDisplaySettings = value;
NotifyOfPropertyChange(() => VolumeDisplaySettings);
}
}
public void ToggleEffect()
{
VolumeDisplayModel.Enabled = _volumeDisplaySettings.Enabled;
}
public void SaveSettings()
{
if (VolumeDisplayModel == null)
return;
VolumeDisplaySettings.Save();
}
public void ResetSettings()
{
// TODO: Confirmation dialog (Generic MVVM approach)
VolumeDisplaySettings.ToDefault();
NotifyOfPropertyChange(() => VolumeDisplaySettings);
SaveSettings();
OverlayModel = new VolumeDisplayModel(mainManager, (VolumeDisplaySettings) OverlaySettings);
MainManager.EffectManager.EffectModels.Add(OverlayModel);
}
}
}

View File

@ -2,17 +2,41 @@
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="false"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log" >
<!-- optional, add some variabeles
https://github.com/nlog/NLog/wiki/Configuration-file#variables
-->
<variable name="myvar" value="myvalue"/>
<!--
See https://github.com/nlog/nlog/wiki/Configuration-file
for information on customizing logging rules and outputs.
-->
<targets>
<target name="file" xsi:type="File" maxArchiveFiles="7" fileName="${specialfolder:folder=MyDocuments}/Artemis/logs/${shortdate}.txt"/>
<target name="debugger" xsi:type="Debugger" layout="${logger:shortName=True} - ${uppercase:${level}}: ${message}"/>
<!--
add your targets here
See https://github.com/nlog/NLog/wiki/Targets for possible targets.
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
-->
<!--
Write events to a file with the date in the filename.
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${message}" />
-->
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="file" />
<logger name="*" minlevel="Debug" writeTo="debugger" />
<!-- add your logging rules here -->
<!--
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
<logger name="*" minlevel="Debug" writeTo="f" />
-->
</rules>
</nlog>

View File

@ -0,0 +1,40 @@
using Artemis.Modules.Effects.AmbientLightning;
using Artemis.Modules.Effects.AudioVisualizer;
using Artemis.Modules.Effects.Debug;
using Artemis.Modules.Effects.TypeWave;
using Artemis.Modules.Games.CounterStrike;
using Artemis.Modules.Games.Dota2;
using Artemis.Modules.Games.RocketLeague;
using Artemis.Modules.Games.TheDivision;
using Artemis.Modules.Games.Witcher3;
using Artemis.Modules.Overlays.VolumeDisplay;
using Artemis.ViewModels.Abstract;
using Caliburn.Micro;
using Ninject.Modules;
namespace Artemis.NinjectModules
{
public class ArtemisModules : NinjectModule
{
public override void Load()
{
// Effects
//Bind<EffectViewModel>().To<AmbientLightningEffectViewModel>().InSingletonScope();
Bind<EffectViewModel>().To<AudioVisualizerViewModel>().InSingletonScope();
Bind<EffectViewModel>().To<DebugEffectViewModel>().InSingletonScope();
Bind<EffectViewModel>().To<TypeWaveViewModel>().InSingletonScope();
// Games
Bind<Screen>().To(typeof(GameViewModel<>)); // TODO: Needed?
Bind<GameViewModel<CounterStrikeDataModel>>().To<CounterStrikeViewModel>().InSingletonScope();
Bind<GameViewModel<Dota2DataModel>>().To<Dota2ViewModel>().InSingletonScope();
Bind<GameViewModel<RocketLeagueDataModel>>().To<RocketLeagueViewModel>().InSingletonScope();
Bind<GameViewModel<TheDivisionDataModel>>().To<TheDivisionViewModel>().InSingletonScope();
Bind<GameViewModel<Witcher3DataModel>>().To<Witcher3ViewModel>().InSingletonScope();
// Overlays
Bind<OverlayViewModel>().To<VolumeDisplayViewModel>().InSingletonScope();
}
}
}

View File

@ -0,0 +1,15 @@
using Artemis.Managers;
using Ninject.Modules;
namespace Artemis.NinjectModules
{
internal class ManagerModules : NinjectModule
{
public override void Load()
{
Bind<MainManager>().ToSelf().InSingletonScope();
Bind<KeyboardManager>().ToSelf().InSingletonScope();
Bind<EffectManager>().ToSelf().InSingletonScope();
}
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,51 @@
using Artemis.Managers;
using Artemis.Models;
using Caliburn.Micro;
namespace Artemis.ViewModels.Abstract
{
public abstract class OverlayViewModel : Screen
{
private OverlaySettings _overlaySettings;
public OverlayModel OverlayModel { get; set; }
public MainManager MainManager { get; set; }
public OverlaySettings OverlaySettings
{
get { return _overlaySettings; }
set
{
if (Equals(value, _overlaySettings)) return;
_overlaySettings = value;
NotifyOfPropertyChange(() => OverlaySettings);
}
}
public void ToggleOverlay()
{
OverlayModel.Enabled = OverlaySettings.Enabled;
}
public void SaveSettings()
{
OverlaySettings?.Save();
}
public async void ResetSettings()
{
var resetConfirm = await
MainManager.DialogService.ShowQuestionMessageBox("Reset overlay settings",
"Are you sure you wish to reset this overlay's settings? \nAny changes you made will be lost.");
if (!resetConfirm.Value)
return;
OverlaySettings.ToDefault();
NotifyOfPropertyChange(() => OverlaySettings);
OverlayModel.Enabled = OverlaySettings.Enabled;
SaveSettings();
}
}
}

View File

@ -141,7 +141,7 @@ namespace Artemis.ViewModels
var pen = new Pen(new SolidColorBrush(color), 0.4);
// Draw the selection outline and resize indicator
if (SelectedLayer != null && SelectedLayer.Enabled)
if (SelectedLayer != null && ShouldDrawLayer(SelectedLayer))
{
var layerRect = SelectedLayer.UserProps.GetRect();
// Deflate the rect so that the border is drawn on the inside
@ -390,7 +390,7 @@ namespace Artemis.ViewModels
var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width);
var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height);
var hoverLayer = SelectedProfile.Layers.OrderBy(l => l.Order).Where(l => l.Enabled)
var hoverLayer = SelectedProfile.Layers.OrderBy(l => l.Order).Where(ShouldDrawLayer)
.FirstOrDefault(l => l.UserProps.GetRect(1).Contains(x, y));
SelectedLayer = hoverLayer;
}
@ -404,7 +404,7 @@ namespace Artemis.ViewModels
var pos = e.GetPosition((Image) e.OriginalSource);
var x = pos.X/((double) ActiveKeyboard.PreviewSettings.Width/ActiveKeyboard.Width);
var y = pos.Y/((double) ActiveKeyboard.PreviewSettings.Height/ActiveKeyboard.Height);
var hoverLayer = SelectedProfile.Layers.OrderBy(l => l.Order).Where(l => l.Enabled)
var hoverLayer = SelectedProfile.Layers.OrderBy(l => l.Order).Where(ShouldDrawLayer)
.FirstOrDefault(l => l.UserProps.GetRect(1).Contains(x, y));
HandleDragging(e, x, y, hoverLayer);
@ -482,5 +482,10 @@ namespace Artemis.ViewModels
}
NotifyOfPropertyChange(() => KeyboardPreview);
}
private bool ShouldDrawLayer(LayerModel layer)
{
return layer.Enabled && (layer.LayerType == LayerType.Keyboard || layer.LayerType == LayerType.KeyboardGif);
}
}
}

View File

@ -1,9 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Autofac" version="4.0.0-rc1-177" targetFramework="net452" />
<package id="Caliburn.Micro" version="2.0.2" targetFramework="net452" />
<package id="Caliburn.Micro.AutofacBootstrap" version="2.0.9-beta" targetFramework="net452" />
<package id="Caliburn.Micro.Core" version="2.0.2" targetFramework="net452" />
<package id="Caliburn.Micro" version="3.0.1" targetFramework="net452" />
<package id="Caliburn.Micro.Core" version="3.0.1" targetFramework="net452" />
<package id="Colore" version="4.0.0" targetFramework="net452" />
<package id="CUE.NET" version="1.0.2.2" targetFramework="net452" />
<package id="Extended.Wpf.Toolkit" version="2.7" targetFramework="net452" />
@ -11,11 +9,12 @@
<package id="ImageLibrary" version="2.0.5" targetFramework="net452" />
<package id="log4net" version="2.0.5" targetFramework="net452" />
<package id="MahApps.Metro" version="1.2.4.0" targetFramework="net452" />
<package id="MahApps.Metro.Resources" version="0.5.0.0" targetFramework="net452" />
<package id="MahApps.Metro.Resources" version="0.6.1.0" targetFramework="net452" />
<package id="NAudio" version="1.7.3" targetFramework="net452" />
<package id="Newtonsoft.Json" version="8.0.3" targetFramework="net452" />
<package id="NLog" version="4.3.2" targetFramework="net452" />
<package id="NLog.Config" version="4.3.2" targetFramework="net452" />
<package id="Ninject" version="3.2.2.0" targetFramework="net452" />
<package id="NLog" version="4.3.3" targetFramework="net452" />
<package id="NLog.Config" version="4.3.3" targetFramework="net452" />
<package id="NLog.Schema" version="4.3.0" targetFramework="net452" />
<package id="SharpDX" version="3.0.2" targetFramework="net452" />
<package id="SharpDX.Direct3D11" version="3.0.2" targetFramework="net452" />
@ -23,5 +22,4 @@
<package id="System.Linq.Dynamic" version="1.0.6" targetFramework="net452" />
<package id="VirtualInput" version="1.0.1" targetFramework="net452" />
<package id="WpfExceptionViewer" version="1.0.0.0" targetFramework="net452" />
<package id="XamlAnimatedGif" version="1.1.2" targetFramework="net452" />
</packages>