diff --git a/.ncrunch/GitHub.UI.UnitTests.v3.ncrunchproject b/.ncrunch/GitHub.UI.UnitTests.v3.ncrunchproject
new file mode 100644
index 0000000000..55fdc2c86f
--- /dev/null
+++ b/.ncrunch/GitHub.UI.UnitTests.v3.ncrunchproject
@@ -0,0 +1,6 @@
+
+
+ True
+ True
+
+
\ No newline at end of file
diff --git a/GitHubVS.sln b/GitHubVS.sln
index 54486ea1ff..e5210cab6a 100644
--- a/GitHubVS.sln
+++ b/GitHubVS.sln
@@ -114,8 +114,6 @@ Global
Publish|x86 = Publish|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
- XamlDesign|Any CPU = XamlDesign|Any CPU
- XamlDesign|x86 = XamlDesign|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@@ -129,10 +127,6 @@ Global
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Release|Any CPU.Build.0 = Release|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Release|x86.ActiveCfg = Release|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Release|x86.Build.0 = Release|Any CPU
- {11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|Any CPU.ActiveCfg = XamlDesign|Any CPU
- {11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|Any CPU.Build.0 = XamlDesign|Any CPU
- {11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|x86.ActiveCfg = XamlDesign|Any CPU
- {11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|x86.Build.0 = XamlDesign|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -144,10 +138,6 @@ Global
{596595A6-2A3C-469E-9386-9E3767D863A5}.Release|Any CPU.Build.0 = Release|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Release|x86.ActiveCfg = Release|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Release|x86.Build.0 = Release|Any CPU
- {596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|x86.Build.0 = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -159,10 +149,6 @@ Global
{346384DD-2445-4A28-AF22-B45F3957BD89}.Release|Any CPU.Build.0 = Release|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Release|x86.ActiveCfg = Release|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Release|x86.Build.0 = Release|Any CPU
- {346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|Any CPU.ActiveCfg = XamlDesign|Any CPU
- {346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|Any CPU.Build.0 = XamlDesign|Any CPU
- {346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|x86.Build.0 = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -174,10 +160,6 @@ Global
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Release|Any CPU.Build.0 = Release|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Release|x86.ActiveCfg = Release|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Release|x86.Build.0 = Release|Any CPU
- {158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|x86.Build.0 = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -189,10 +171,6 @@ Global
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Release|Any CPU.Build.0 = Release|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Release|x86.ActiveCfg = Release|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Release|x86.Build.0 = Release|Any CPU
- {6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|x86.Build.0 = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -204,10 +182,6 @@ Global
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Release|Any CPU.Build.0 = Release|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Release|x86.ActiveCfg = Release|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Release|x86.Build.0 = Release|Any CPU
- {6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|x86.Build.0 = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -219,10 +193,6 @@ Global
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Release|Any CPU.Build.0 = Release|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Release|x86.ActiveCfg = Release|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Release|x86.Build.0 = Release|Any CPU
- {1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|x86.Build.0 = Debug|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Debug|Any CPU.Build.0 = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -234,10 +204,6 @@ Global
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Release|Any CPU.Build.0 = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Release|x86.ActiveCfg = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Release|x86.Build.0 = Release|Any CPU
- {4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|x86.Build.0 = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -249,10 +215,6 @@ Global
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Release|Any CPU.Build.0 = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Release|x86.ActiveCfg = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Release|x86.Build.0 = Release|Any CPU
- {9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|x86.Build.0 = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -264,10 +226,6 @@ Global
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Release|Any CPU.Build.0 = Release|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Release|x86.ActiveCfg = Release|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Release|x86.Build.0 = Release|Any CPU
- {B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|x86.Build.0 = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -279,10 +237,6 @@ Global
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Release|Any CPU.Build.0 = Release|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Release|x86.ActiveCfg = Release|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Release|x86.Build.0 = Release|Any CPU
- {E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|x86.Build.0 = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -294,10 +248,6 @@ Global
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Release|Any CPU.Build.0 = Release|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Release|x86.ActiveCfg = Release|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Release|x86.Build.0 = Release|Any CPU
- {B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|x86.Build.0 = Debug|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Debug|Any CPU.Build.0 = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -309,10 +259,6 @@ Global
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Release|Any CPU.Build.0 = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Release|x86.ActiveCfg = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Release|x86.Build.0 = Release|Any CPU
- {08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|x86.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Debug|Any CPU.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -324,10 +270,6 @@ Global
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Release|Any CPU.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Release|x86.ActiveCfg = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Release|x86.Build.0 = Release|Any CPU
- {674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|x86.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Debug|Any CPU.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -339,10 +281,6 @@ Global
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Release|Any CPU.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Release|x86.ActiveCfg = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Release|x86.Build.0 = Release|Any CPU
- {1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|x86.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Debug|Any CPU.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -354,10 +292,6 @@ Global
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Release|Any CPU.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Release|x86.ActiveCfg = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Release|x86.Build.0 = Release|Any CPU
- {600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|x86.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Debug|Any CPU.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -369,10 +303,6 @@ Global
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Release|Any CPU.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Release|x86.ActiveCfg = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Release|x86.Build.0 = Release|Any CPU
- {B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|x86.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Debug|Any CPU.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -384,10 +314,6 @@ Global
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Release|Any CPU.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Release|x86.ActiveCfg = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Release|x86.Build.0 = Release|Any CPU
- {241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|x86.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Debug|Any CPU.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -400,10 +326,6 @@ Global
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Release|Any CPU.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Release|x86.ActiveCfg = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Release|x86.Build.0 = Release|Any CPU
- {EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|x86.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Debug|Any CPU.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -415,10 +337,6 @@ Global
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Release|Any CPU.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Release|x86.ActiveCfg = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Release|x86.Build.0 = Release|Any CPU
- {252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|x86.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Debug|Any CPU.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -430,10 +348,6 @@ Global
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Release|Any CPU.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Release|x86.ActiveCfg = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Release|x86.Build.0 = Release|Any CPU
- {0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|x86.Build.0 = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -446,10 +360,6 @@ Global
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Release|Any CPU.Build.0 = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Release|x86.ActiveCfg = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Release|x86.Build.0 = Release|Any CPU
- {41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
- {41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|x86.Build.0 = Debug|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Debug|Any CPU.Build.0 = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Debug|x86.ActiveCfg = Release|Any CPU
@@ -462,10 +372,6 @@ Global
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Release|Any CPU.Build.0 = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Release|x86.ActiveCfg = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Release|x86.Build.0 = Release|Any CPU
- {DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|x86.Build.0 = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -478,8 +384,6 @@ Global
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Release|Any CPU.Build.0 = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Release|x86.ActiveCfg = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Release|x86.Build.0 = Release|Any CPU
- {7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -492,10 +396,6 @@ Global
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Release|Any CPU.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Release|x86.ActiveCfg = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Release|x86.Build.0 = Release|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|x86.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -508,10 +408,6 @@ Global
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Release|Any CPU.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Release|x86.ActiveCfg = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Release|x86.Build.0 = Release|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|x86.Build.0 = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -524,10 +420,6 @@ Global
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Release|Any CPU.Build.0 = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Release|x86.ActiveCfg = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Release|x86.Build.0 = Release|Any CPU
- {D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|Any CPU.ActiveCfg = XamlDesign|Any CPU
- {D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|Any CPU.Build.0 = XamlDesign|Any CPU
- {D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|x86.Build.0 = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -544,6 +436,18 @@ Global
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|x86.Build.0 = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Debug|x86.Build.0 = Debug|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Publish|Any CPU.ActiveCfg = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Publish|Any CPU.Build.0 = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Publish|x86.ActiveCfg = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Publish|x86.Build.0 = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Release|x86.ActiveCfg = Release|Any CPU
+ {9453C37F-44CF-463D-B563-5C3110CEF5E7}.Release|x86.Build.0 = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -556,10 +460,6 @@ Global
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|Any CPU.Build.0 = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|x86.ActiveCfg = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|x86.Build.0 = Release|Any CPU
- {110B206F-8554-4B51-BF86-94DAA32F5E26}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
- {110B206F-8554-4B51-BF86-94DAA32F5E26}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
- {110B206F-8554-4B51-BF86-94DAA32F5E26}.XamlDesign|x86.ActiveCfg = Release|Any CPU
- {110B206F-8554-4B51-BF86-94DAA32F5E26}.XamlDesign|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/src/GitHub.UI/GitHub.UI.csproj b/src/GitHub.UI/GitHub.UI.csproj
index ddd690a2d1..850fbe4213 100644
--- a/src/GitHub.UI/GitHub.UI.csproj
+++ b/src/GitHub.UI/GitHub.UI.csproj
@@ -41,18 +41,6 @@
true
..\common\GitHubVS.ruleset
-
- true
- full
- false
- DEBUG;TRACE;XAML_DESIGNER
- prompt
- 4
- false
- ..\common\GitHubVS.ruleset
- true
- true
-
..\..\script\Key.snk
true
@@ -110,6 +98,7 @@
+
True
True
diff --git a/src/GitHub.UI/Helpers/LoadingResourceDictionary.cs b/src/GitHub.UI/Helpers/LoadingResourceDictionary.cs
index ed7382a74c..27c8523dce 100644
--- a/src/GitHub.UI/Helpers/LoadingResourceDictionary.cs
+++ b/src/GitHub.UI/Helpers/LoadingResourceDictionary.cs
@@ -9,7 +9,6 @@ namespace GitHub
{
public class LoadingResourceDictionary : ResourceDictionary
{
-#if !XAML_DESIGNER // XAML Designer doesn't work if `Source` property has been replaced.
static Dictionary assemblyDicts = new Dictionary();
public new Uri Source
@@ -72,6 +71,5 @@ static string FindAssemblyNameFromPackUri(Uri packUri)
return path.Substring(1, componentIndex - 1);
}
-#endif
}
}
diff --git a/src/GitHub.UI/Helpers/SharedDictionaryManager.cs b/src/GitHub.UI/Helpers/SharedDictionaryManager.cs
index 4e72eabf34..0b929e1eaa 100644
--- a/src/GitHub.UI/Helpers/SharedDictionaryManager.cs
+++ b/src/GitHub.UI/Helpers/SharedDictionaryManager.cs
@@ -1,31 +1,8 @@
-using System;
-using System.Collections.Generic;
-using System.Windows;
+using GitHub.Helpers;
namespace GitHub.UI.Helpers
{
- public class SharedDictionaryManager : LoadingResourceDictionary
+ public class SharedDictionaryManager : SharedDictionaryManagerBase
{
-#if !XAML_DESIGNER // XAML Designer doesn't work if `Source` property has been replaced.
- static readonly Dictionary resourceDicts = new Dictionary();
-
- Uri sourceUri;
- public new Uri Source
- {
- get { return sourceUri; }
- set
- {
- sourceUri = value;
- ResourceDictionary ret;
- if (resourceDicts.TryGetValue(value, out ret))
- {
- MergedDictionaries.Add(ret);
- return;
- }
- base.Source = value;
- resourceDicts.Add(value, this);
- }
- }
-#endif
}
}
diff --git a/src/GitHub.UI/Helpers/SharedDictionaryManagerBase.cs b/src/GitHub.UI/Helpers/SharedDictionaryManagerBase.cs
new file mode 100644
index 0000000000..67e44522a4
--- /dev/null
+++ b/src/GitHub.UI/Helpers/SharedDictionaryManagerBase.cs
@@ -0,0 +1,115 @@
+using System;
+using System.Windows;
+using System.Collections.Generic;
+
+namespace GitHub.Helpers
+{
+ public class SharedDictionaryManagerBase : ResourceDictionary
+ {
+ static IDictionary sharedDictionaries;
+ static IList disposables;
+ Uri source;
+
+ static SharedDictionaryManagerBase()
+ {
+ // Avoid leaking resources at design time.
+ sharedDictionaries = GetAppDomainSharedDictionaries();
+ disposables = GetAppDomainDisposables();
+ }
+
+ public virtual new Uri Source
+ {
+ get { return source; }
+ set
+ {
+ source = value;
+
+ value = FixDesignTimeUri(value);
+ var rd = GetResourceDictionary(value);
+ MergedDictionaries.Clear();
+ MergedDictionaries.Add(rd);
+
+ // Remember dictionaries that need disposing of.
+ var disposable = this as IDisposable;
+ if (disposable != null && !disposables.Contains(disposable))
+ {
+ disposables.Add(disposable);
+ }
+ }
+ }
+
+ ResourceDictionary GetResourceDictionary(Uri uri)
+ {
+ ResourceDictionary rd;
+ if (!sharedDictionaries.TryGetValue(uri, out rd))
+ {
+ rd = new LoadingResourceDictionary { Source = uri };
+ sharedDictionaries[uri] = rd;
+ }
+
+ return rd;
+ }
+
+ public static Uri FixDesignTimeUri(Uri inUri)
+ {
+ if (inUri.Scheme != "file")
+ {
+ return inUri;
+ }
+
+ var url = inUri.ToString();
+ var assemblyPrefix = "/src/";
+ var assemblyIndex = url.LastIndexOf(assemblyPrefix);
+ if (assemblyIndex == -1)
+ {
+ return inUri;
+ }
+
+ assemblyIndex += assemblyPrefix.Length;
+ var pathIndex = url.IndexOf('/', assemblyIndex);
+ if (pathIndex == -1)
+ {
+ return inUri;
+ }
+
+ var assemblyName = url.Substring(assemblyIndex, pathIndex - assemblyIndex);
+ var path = url.Substring(pathIndex + 1);
+
+ return new Uri($"pack://application:,,,/{assemblyName};component/{path}");
+ }
+
+ static IDictionary GetAppDomainSharedDictionaries()
+ {
+ var name = typeof(SharedDictionaryManagerBase).FullName + ".SharedDictionaries";
+ var sharedDictionaries = GetAppDomainData>(name);
+
+ sharedDictionaries.Clear();
+ return sharedDictionaries;
+ }
+
+ static IList GetAppDomainDisposables()
+ {
+ var name = typeof(SharedDictionaryManagerBase).FullName + ".Disposables";
+ var disposables = GetAppDomainData>(name);
+ foreach (var disposable in disposables)
+ {
+ disposable.Dispose();
+ }
+
+ disposables.Clear();
+ return disposables;
+ }
+
+ static T GetAppDomainData(string name) where T : new()
+ {
+ var data = (T)AppDomain.CurrentDomain.GetData(name);
+ if (data == null)
+ {
+ data = new T();
+ AppDomain.CurrentDomain.SetData(name, data);
+ }
+
+ return data;
+ }
+ }
+}
diff --git a/src/GitHub.VisualStudio.UI/GitHub.VisualStudio.UI.csproj b/src/GitHub.VisualStudio.UI/GitHub.VisualStudio.UI.csproj
index d69addba4a..6b95a9207d 100644
--- a/src/GitHub.VisualStudio.UI/GitHub.VisualStudio.UI.csproj
+++ b/src/GitHub.VisualStudio.UI/GitHub.VisualStudio.UI.csproj
@@ -34,16 +34,6 @@
TRACE
prompt
-
- true
- full
- false
- TRACE;DEBUG;CODE_ANALYSIS;XAML_DESIGNER
- prompt
- True
- True
- true
-
..\..\script\Key.snk
true
@@ -83,6 +73,7 @@
+
diff --git a/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs b/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs
index 61780a3ef5..49983f86bd 100644
--- a/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs
+++ b/src/GitHub.VisualStudio.UI/Helpers/SharedDictionaryManager.cs
@@ -1,67 +1,8 @@
-using System;
-using System.Collections.Generic;
-using System.Windows;
-using Microsoft.VisualStudio.PlatformUI;
-using GitHub.VisualStudio.Helpers;
+using GitHub.Helpers;
namespace GitHub.VisualStudio.UI.Helpers
{
- public class SharedDictionaryManager : LoadingResourceDictionary
+ public class SharedDictionaryManager : SharedDictionaryManagerBase
{
-#if !XAML_DESIGNER // XAML Designer doesn't work if `Source` property has been replaced.
- public SharedDictionaryManager()
- {
- currentTheme = Colors.DetectTheme();
- }
-
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
- string currentTheme;
-
- static readonly Dictionary resourceDicts = new Dictionary();
- static string baseThemeUri = "pack://application:,,,/GitHub.VisualStudio.UI;component/Styles/";
-
- Uri sourceUri;
- bool themed = false;
- public new Uri Source
- {
- get { return sourceUri; }
- set
- {
- if (value.ToString() == "pack://application:,,,/GitHub.VisualStudio.UI;component/Styles/ThemeDesignTime.xaml")
- {
- if (!themed)
- {
- themed = true;
- VSColorTheme.ThemeChanged += OnThemeChange;
- }
- value = new Uri(baseThemeUri + "Theme" + currentTheme + ".xaml");
- }
-
- sourceUri = value;
- ResourceDictionary ret;
- if (resourceDicts.TryGetValue(value, out ret))
- {
- if (ret != this)
- {
- MergedDictionaries.Add(ret);
- return;
- }
- }
- base.Source = value;
- if (ret == null)
- resourceDicts.Add(value, this);
- }
- }
-
- void OnThemeChange(ThemeChangedEventArgs e)
- {
- var uri = new Uri(baseThemeUri + "Theme" + currentTheme + ".xaml");
- ResourceDictionary ret;
- if (resourceDicts.TryGetValue(uri, out ret))
- MergedDictionaries.Remove(ret);
- currentTheme = Colors.DetectTheme();
- Source = uri;
- }
-#endif
}
}
\ No newline at end of file
diff --git a/src/GitHub.VisualStudio.UI/Helpers/ThemeDictionaryManager.cs b/src/GitHub.VisualStudio.UI/Helpers/ThemeDictionaryManager.cs
new file mode 100644
index 0000000000..8128926743
--- /dev/null
+++ b/src/GitHub.VisualStudio.UI/Helpers/ThemeDictionaryManager.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Windows;
+using System.ComponentModel;
+using Microsoft.VisualStudio.PlatformUI;
+using GitHub.VisualStudio.Helpers;
+using GitHub.Helpers;
+
+namespace GitHub.VisualStudio.UI.Helpers
+{
+ public class ThemeDictionaryManager : SharedDictionaryManagerBase, IDisposable
+ {
+ static bool isInDesignMode;
+ Uri baseThemeUri;
+
+ static ThemeDictionaryManager()
+ {
+ isInDesignMode = DesignerProperties.GetIsInDesignMode(new DependencyObject());
+ }
+
+ public override Uri Source
+ {
+ get { return base.Source; }
+ set
+ {
+ InitTheme(value);
+ base.Source = GetCurrentThemeUri();
+ }
+ }
+
+ public void Dispose()
+ {
+ if(baseThemeUri != null)
+ {
+ baseThemeUri = null;
+ if (!isInDesignMode)
+ {
+ VSColorTheme.ThemeChanged -= OnThemeChange;
+ }
+ }
+ }
+
+ void InitTheme(Uri themeUri)
+ {
+ if (baseThemeUri == null)
+ {
+ baseThemeUri = themeUri;
+ if (!isInDesignMode)
+ {
+ VSColorTheme.ThemeChanged += OnThemeChange;
+ }
+ }
+ }
+
+ void OnThemeChange(ThemeChangedEventArgs e)
+ {
+ base.Source = GetCurrentThemeUri();
+ }
+
+ Uri GetCurrentThemeUri()
+ {
+ if (isInDesignMode)
+ {
+ return baseThemeUri;
+ }
+
+ var currentTheme = Colors.DetectTheme();
+ return new Uri(baseThemeUri, $"Theme{currentTheme}.xaml");
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/GitHub.VisualStudio.UI/SharedDictionary.xaml b/src/GitHub.VisualStudio.UI/SharedDictionary.xaml
index 1bd0cad6ab..d1eeed6b8d 100644
--- a/src/GitHub.VisualStudio.UI/SharedDictionary.xaml
+++ b/src/GitHub.VisualStudio.UI/SharedDictionary.xaml
@@ -5,7 +5,7 @@
xmlns:ui="clr-namespace:GitHub.UI;assembly=GitHub.UI">
-
+
diff --git a/src/GitHub.VisualStudio/GitHub.VisualStudio.csproj b/src/GitHub.VisualStudio/GitHub.VisualStudio.csproj
index 655916a0a8..d92b61d513 100644
--- a/src/GitHub.VisualStudio/GitHub.VisualStudio.csproj
+++ b/src/GitHub.VisualStudio/GitHub.VisualStudio.csproj
@@ -82,21 +82,6 @@
..\common\GitHubVS.ruleset
False
-
- true
- full
- false
- TRACE;DEBUG;CODE_ANALYSIS;XAML_DESIGNER
- prompt
- 4
- true
- ..\common\GitHubVS.ruleset
- true
- true
- True
- True
- true
-
false
diff --git a/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs b/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs
index 4a6229a4b7..2e85a4f701 100644
--- a/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs
+++ b/src/GitHub.VisualStudio/Helpers/SharedDictionaryManager.cs
@@ -1,32 +1,8 @@
using GitHub.Helpers;
-using System;
-using System.Collections.Generic;
-using System.Windows;
namespace GitHub.VisualStudio.Helpers
{
- public class SharedDictionaryManager : LoadingResourceDictionary
+ public class SharedDictionaryManager : SharedDictionaryManagerBase
{
-#if !XAML_DESIGNER // XAML Designer doesn't work if `Source` property has been replaced.
- static readonly Dictionary resourceDicts = new Dictionary();
-
- Uri sourceUri;
- public new Uri Source
- {
- get { return sourceUri; }
- set
- {
- sourceUri = value;
- ResourceDictionary ret;
- if (resourceDicts.TryGetValue(value, out ret))
- {
- MergedDictionaries.Add(ret);
- return;
- }
- base.Source = value;
- resourceDicts.Add(value, this);
- }
- }
-#endif
}
}
diff --git a/test/GitHub.UI.UnitTests/GitHub.UI.UnitTests.csproj b/test/GitHub.UI.UnitTests/GitHub.UI.UnitTests.csproj
index ddd4dbb92b..9bda83b0e7 100644
--- a/test/GitHub.UI.UnitTests/GitHub.UI.UnitTests.csproj
+++ b/test/GitHub.UI.UnitTests/GitHub.UI.UnitTests.csproj
@@ -50,6 +50,7 @@
+
@@ -58,6 +59,10 @@
+
+ {9aea02db-02b5-409c-b0ca-115d05331a6b}
+ GitHub.Exports
+
{346384dd-2445-4a28-af22-b45f3957bd89}
GitHub.UI
diff --git a/test/GitHub.UI.UnitTests/ResourceDictionaryUtilities.cs b/test/GitHub.UI.UnitTests/ResourceDictionaryUtilities.cs
index 787dae769a..48c8f3ce55 100644
--- a/test/GitHub.UI.UnitTests/ResourceDictionaryUtilities.cs
+++ b/test/GitHub.UI.UnitTests/ResourceDictionaryUtilities.cs
@@ -30,18 +30,12 @@ public static void DumpResourceDictionary(TextWriter writer, ResourceDictionary
if (source != null)
{
writer.WriteLine(indent + source + " (" + rd.GetType().FullName + ") # " + rd.GetHashCode());
- foreach (var child in rd.MergedDictionaries)
- {
- DumpResourceDictionary(writer, child, indent + " ");
- }
+ indent += " ";
}
- else
+
+ foreach (var child in rd.MergedDictionaries)
{
- // ignore our empty nodes
- foreach (var child in rd.MergedDictionaries)
- {
- DumpResourceDictionary(writer, child, indent);
- }
+ DumpResourceDictionary(writer, child, indent);
}
}
}
diff --git a/test/GitHub.UI.UnitTests/SharedDictionaryManagerBaseTests.cs b/test/GitHub.UI.UnitTests/SharedDictionaryManagerBaseTests.cs
new file mode 100644
index 0000000000..914f31a58c
--- /dev/null
+++ b/test/GitHub.UI.UnitTests/SharedDictionaryManagerBaseTests.cs
@@ -0,0 +1,38 @@
+using System;
+using GitHub.Helpers;
+using NUnit.Framework;
+
+namespace GitHub.UI.UnitTests
+{
+ public class SharedDictionaryManagerBaseTests
+ {
+ public class TheFixDesignTimeUriMethod
+ {
+ [TestCase("pack://application:,,,/GitHub.VisualStudio.UI;component/SharedDictionary.xaml", "pack://application:,,,/GitHub.VisualStudio.UI;component/SharedDictionary.xaml")]
+ [TestCase("file:///x:/solution/src/GitHub.VisualStudio.UI/SharedDictionary.xaml", "pack://application:,,,/GitHub.VisualStudio.UI;component/SharedDictionary.xaml")]
+ [TestCase("file:///x:/solution/src/GitHub.VisualStudio.UI/Styles/GitHubComboBox.xaml", "pack://application:,,,/GitHub.VisualStudio.UI;component/Styles/GitHubComboBox.xaml")]
+ public void FixDesignTimeUri(string inUrl, string outUrl)
+ {
+ var inUri = ResourceDictionaryUtilities.ToPackUri(inUrl);
+
+ var outUri = SharedDictionaryManagerBase.FixDesignTimeUri(inUri);
+
+ Assert.That(outUri.ToString(), Is.EqualTo(outUrl));
+ }
+ }
+
+ public class TheSourceProperty
+ {
+ [TestCase("pack://application:,,,/GitHub.UI;component/SharedDictionary.xaml")]
+ public void IsEqualToSet(string url)
+ {
+ var uri = ResourceDictionaryUtilities.ToPackUri(url);
+ var target = new SharedDictionaryManagerBase();
+
+ target.Source = uri;
+
+ Assert.That(target.Source, Is.EqualTo(uri));
+ }
+ }
+ }
+}
diff --git a/test/GitHub.UI.UnitTests/SharedDictionaryManagerTests.cs b/test/GitHub.UI.UnitTests/SharedDictionaryManagerTests.cs
index 8f8c3689ed..32bf618c4d 100644
--- a/test/GitHub.UI.UnitTests/SharedDictionaryManagerTests.cs
+++ b/test/GitHub.UI.UnitTests/SharedDictionaryManagerTests.cs
@@ -11,16 +11,18 @@ public class TheSourceProperty
{
[TestCase("pack://application:,,,/GitHub.UI;component/SharedDictionary.xaml")]
[TestCase("pack://application:,,,/GitHub.VisualStudio.UI;component/SharedDictionary.xaml")]
+ [TestCase("file:///x:/Project/src/GitHub.UI/SharedDictionary.xaml", Description = "This is a design time URL")]
+ [TestCase("file:///x:/Project/src/GitHub.VisualStudio.UI/SharedDictionary.xaml", Description = "This is a design time URL")]
[RequiresThread(System.Threading.ApartmentState.STA)]
- public void SetSourceOnDifferentInstances_ExpectTheSameObjects(params string[] urls)
+ public void SetSourceOnDifferentInstances_ExpectTheSameObjects(string url)
{
var setup = new AppDomainSetup { ApplicationBase = "NOTHING_HERE" };
using (var context = new AppDomainContext(setup))
{
var remote = context.CreateInstance();
- string expectDump = remote.DumpMergedDictionariesSharedDictionaryManager(urls);
+ string expectDump = remote.DumpMergedDictionariesSharedDictionaryManager(url);
- var dump = remote.DumpMergedDictionariesSharedDictionaryManager(urls);
+ var dump = remote.DumpMergedDictionariesSharedDictionaryManager(url);
Assert.That(dump, Is.EqualTo(expectDump));
}
@@ -30,15 +32,15 @@ public void SetSourceOnDifferentInstances_ExpectTheSameObjects(params string[] u
[TestCase("pack://application:,,,/GitHub.UI;component/SharedDictionary.xaml")]
[TestCase("pack://application:,,,/GitHub.VisualStudio.UI;component/SharedDictionary.xaml")]
[RequiresThread(System.Threading.ApartmentState.STA)]
- public void SetResourceDictionarySourceOnDifferentInstances_ExpectDifferentObjects(params string[] urls)
+ public void SetResourceDictionarySourceOnDifferentInstances_ExpectDifferentObjects(string url)
{
var setup = new AppDomainSetup { ApplicationBase = "NOTHING_HERE" };
using (var context = new AppDomainContext(setup))
{
var remote = context.CreateInstance();
- string expectDump = remote.DumpMergedDictionariesLoadingResourceDictionary(urls);
+ string expectDump = remote.DumpMergedDictionariesLoadingResourceDictionary(url);
- var dump = remote.DumpMergedDictionariesLoadingResourceDictionary(urls);
+ var dump = remote.DumpMergedDictionariesLoadingResourceDictionary(url);
Assert.That(dump, Is.Not.EqualTo(expectDump));
}
@@ -46,24 +48,21 @@ public void SetResourceDictionarySourceOnDifferentInstances_ExpectDifferentObjec
class SharedDictionaryManagerContext : MarshalByRefObject
{
- internal string DumpMergedDictionariesLoadingResourceDictionary(params string[] urls)
+ internal string DumpMergedDictionariesLoadingResourceDictionary(string url)
{
var target = new LoadingResourceDictionary();
- return DumpMergedDictionaries(target, urls);
+ return DumpMergedDictionaries(target, url);
}
- internal string DumpMergedDictionariesSharedDictionaryManager(params string[] urls)
+ internal string DumpMergedDictionariesSharedDictionaryManager(string url)
{
var target = new SharedDictionaryManager();
- return DumpMergedDictionaries(target, urls);
+ return DumpMergedDictionaries(target, url);
}
- string DumpMergedDictionaries(ResourceDictionary target, params string[] urls)
+ string DumpMergedDictionaries(ResourceDictionary target, string url)
{
- foreach(var url in urls)
- {
- SetProperty(target, "Source", ResourceDictionaryUtilities.ToPackUri(url));
- }
+ SetProperty(target, "Source", ResourceDictionaryUtilities.ToPackUri(url));
return ResourceDictionaryUtilities.DumpResourceDictionary(target);
}