diff --git a/Directory.Build.props b/Directory.Build.props
index eacb8a7cc..439fa58c6 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -6,7 +6,7 @@
- 4.0.0
+ 4.0.1
4.0.0
diff --git a/Wpf.Ui.sln b/Wpf.Ui.sln
index 03c890493..87b072d96 100644
--- a/Wpf.Ui.sln
+++ b/Wpf.Ui.sln
@@ -73,16 +73,16 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|arm64.Build.0 = Debug|Any CPU
+ {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|arm64.ActiveCfg = Debug|arm64
+ {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|arm64.Build.0 = Debug|arm64
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x64.ActiveCfg = Debug|x64
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x64.Build.0 = Debug|x64
- {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x86.Build.0 = Debug|Any CPU
+ {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x86.ActiveCfg = Debug|x86
+ {E55BFB14-9DA6-434A-8153-BFE124D71818}.Debug|x86.Build.0 = Debug|x86
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|Any CPU.Build.0 = Release|Any CPU
- {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|arm64.ActiveCfg = Release|Any CPU
- {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|arm64.Build.0 = Release|Any CPU
+ {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|arm64.ActiveCfg = Release|arm64
+ {E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|arm64.Build.0 = Release|arm64
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x64.ActiveCfg = Release|x64
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x64.Build.0 = Release|x64
{E55BFB14-9DA6-434A-8153-BFE124D71818}.Release|x86.ActiveCfg = Release|x86
@@ -91,42 +91,38 @@ Global
{1ADC87D1-8963-4100-845A-18477824718E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Debug|arm64.ActiveCfg = Debug|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Debug|arm64.Build.0 = Debug|Any CPU
- {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x64.ActiveCfg = Debug|x64
- {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x64.Build.0 = Debug|x64
+ {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1ADC87D1-8963-4100-845A-18477824718E}.Debug|x64.Build.0 = Debug|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Debug|x86.ActiveCfg = Debug|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Debug|x86.Build.0 = Debug|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Release|Any CPU.Build.0 = Release|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Release|arm64.ActiveCfg = Release|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Release|arm64.Build.0 = Release|Any CPU
- {1ADC87D1-8963-4100-845A-18477824718E}.Release|x64.ActiveCfg = Release|x64
- {1ADC87D1-8963-4100-845A-18477824718E}.Release|x64.Build.0 = Release|x64
+ {1ADC87D1-8963-4100-845A-18477824718E}.Release|x64.ActiveCfg = Release|Any CPU
+ {1ADC87D1-8963-4100-845A-18477824718E}.Release|x64.Build.0 = Release|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.ActiveCfg = Release|Any CPU
{1ADC87D1-8963-4100-845A-18477824718E}.Release|x86.Build.0 = Release|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|arm64.ActiveCfg = Debug|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|arm64.Build.0 = Debug|Any CPU
- {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x64.ActiveCfg = Debug|x64
- {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x64.Build.0 = Debug|x64
+ {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x64.Build.0 = Debug|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x86.ActiveCfg = Debug|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Debug|x86.Build.0 = Debug|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|Any CPU.Build.0 = Release|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|arm64.ActiveCfg = Release|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|arm64.Build.0 = Release|Any CPU
- {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.ActiveCfg = Release|x64
- {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.Build.0 = Release|x64
+ {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.ActiveCfg = Release|Any CPU
+ {50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x64.Build.0 = Release|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x86.ActiveCfg = Release|Any CPU
{50BAB8DE-6558-4E77-87E5-CD533CBBB72F}.Release|x86.Build.0 = Release|Any CPU
{50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|arm64.ActiveCfg = Debug|ARM64
- {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|arm64.Build.0 = Debug|ARM64
- {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|arm64.Deploy.0 = Debug|ARM64
{50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|x64.ActiveCfg = Debug|x64
{50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|x86.ActiveCfg = Debug|x86
- {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|x86.Build.0 = Debug|x86
- {50C713C3-555E-491F-87EE-C806BEC0579F}.Debug|x86.Deploy.0 = Debug|x86
{50C713C3-555E-491F-87EE-C806BEC0579F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50C713C3-555E-491F-87EE-C806BEC0579F}.Release|arm64.ActiveCfg = Release|ARM64
{50C713C3-555E-491F-87EE-C806BEC0579F}.Release|arm64.Build.0 = Release|ARM64
@@ -141,98 +137,66 @@ Global
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|arm64.ActiveCfg = Debug|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|arm64.Build.0 = Debug|Any CPU
- {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x64.ActiveCfg = Debug|x64
- {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x64.Build.0 = Debug|x64
+ {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x64.Build.0 = Debug|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x86.ActiveCfg = Debug|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Debug|x86.Build.0 = Debug|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|Any CPU.Build.0 = Release|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|arm64.ActiveCfg = Release|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|arm64.Build.0 = Release|Any CPU
- {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x64.ActiveCfg = Release|x64
- {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x64.Build.0 = Release|x64
+ {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x64.ActiveCfg = Release|Any CPU
+ {AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x64.Build.0 = Release|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x86.ActiveCfg = Release|Any CPU
{AE87BE68-DFDC-46D8-BC55-DC9D1DD47F4C}.Release|x86.Build.0 = Release|Any CPU
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|arm64.ActiveCfg = Debug|arm64
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|arm64.Build.0 = Debug|arm64
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|x64.ActiveCfg = Debug|x64
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|x64.Build.0 = Debug|x64
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|x86.ActiveCfg = Debug|x86
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Debug|x86.Build.0 = Debug|x86
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|Any CPU.Build.0 = Release|Any CPU
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|arm64.ActiveCfg = Release|arm64
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|arm64.Build.0 = Release|arm64
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x64.ActiveCfg = Release|x64
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x64.Build.0 = Release|x64
{1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x86.ActiveCfg = Release|x86
- {1298D974-9D81-4A93-9374-EA6A0E723DEB}.Release|x86.Build.0 = Release|x86
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|arm64.ActiveCfg = Debug|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|arm64.Build.0 = Debug|Any CPU
- {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|x64.ActiveCfg = Debug|x64
- {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|x64.Build.0 = Debug|x64
+ {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|x64.Build.0 = Debug|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|x86.ActiveCfg = Debug|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Debug|x86.Build.0 = Debug|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|Any CPU.Build.0 = Release|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|arm64.ActiveCfg = Release|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|arm64.Build.0 = Release|Any CPU
- {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|x64.ActiveCfg = Release|x64
- {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|x64.Build.0 = Release|x64
+ {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|x64.ActiveCfg = Release|Any CPU
+ {4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|x64.Build.0 = Release|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|x86.ActiveCfg = Release|Any CPU
{4059EB00-22B3-4EF9-A509-469CE8B0096D}.Release|x86.Build.0 = Release|Any CPU
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|Any CPU.Build.0 = Debug|Any CPU
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|arm64.ActiveCfg = Debug|arm64
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|arm64.Build.0 = Debug|arm64
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x64.ActiveCfg = Debug|x64
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x64.Build.0 = Debug|x64
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x86.ActiveCfg = Debug|x86
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Debug|x86.Build.0 = Debug|x86
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|Any CPU.Build.0 = Release|Any CPU
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|arm64.ActiveCfg = Release|arm64
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|arm64.Build.0 = Release|arm64
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x64.ActiveCfg = Release|x64
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x64.Build.0 = Release|x64
{14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x86.ActiveCfg = Release|x86
- {14D7431C-6CFF-4191-BB88-2B8D5F323A30}.Release|x86.Build.0 = Release|x86
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|arm64.ActiveCfg = Debug|arm64
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|arm64.Build.0 = Debug|arm64
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|x64.ActiveCfg = Debug|x64
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|x64.Build.0 = Debug|x64
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|x86.ActiveCfg = Debug|x86
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Debug|x86.Build.0 = Debug|x86
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|Any CPU.Build.0 = Release|Any CPU
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|arm64.ActiveCfg = Release|arm64
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|arm64.Build.0 = Release|arm64
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x64.ActiveCfg = Release|x64
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x64.Build.0 = Release|x64
{AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x86.ActiveCfg = Release|x86
- {AB3D44B5-9491-487E-A134-9AC5BED2B981}.Release|x86.Build.0 = Release|x86
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|arm64.ActiveCfg = Debug|arm64
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|arm64.Build.0 = Debug|arm64
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|x64.ActiveCfg = Debug|x64
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|x64.Build.0 = Debug|x64
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|x86.ActiveCfg = Debug|x86
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Debug|x86.Build.0 = Debug|x86
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|Any CPU.Build.0 = Release|Any CPU
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|arm64.ActiveCfg = Release|arm64
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|arm64.Build.0 = Release|arm64
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x64.ActiveCfg = Release|x64
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x64.Build.0 = Release|x64
{4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x86.ActiveCfg = Release|x86
- {4D2706B5-27A9-4542-BD4D-8C22D12D0628}.Release|x86.Build.0 = Release|x86
{3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3E84FE46-D3FD-4E8A-9208-95E315F16E1F}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -317,32 +281,32 @@ Global
{5138077E-670E-413D-94D1-0825B6D1201B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Debug|arm64.ActiveCfg = Debug|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Debug|arm64.Build.0 = Debug|Any CPU
- {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.ActiveCfg = Debug|x64
- {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.Build.0 = Debug|x64
+ {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x64.Build.0 = Debug|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x86.ActiveCfg = Debug|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Debug|x86.Build.0 = Debug|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Release|Any CPU.Build.0 = Release|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Release|arm64.ActiveCfg = Release|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Release|arm64.Build.0 = Release|Any CPU
- {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.ActiveCfg = Release|x64
- {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.Build.0 = Release|x64
+ {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.ActiveCfg = Release|Any CPU
+ {5138077E-670E-413D-94D1-0825B6D1201B}.Release|x64.Build.0 = Release|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Release|x86.ActiveCfg = Release|Any CPU
{5138077E-670E-413D-94D1-0825B6D1201B}.Release|x86.Build.0 = Release|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|arm64.ActiveCfg = Debug|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|arm64.Build.0 = Debug|Any CPU
- {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.ActiveCfg = Debug|x64
- {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.Build.0 = Debug|x64
+ {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x64.Build.0 = Debug|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x86.ActiveCfg = Debug|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Debug|x86.Build.0 = Debug|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|Any CPU.Build.0 = Release|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|arm64.ActiveCfg = Release|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|arm64.Build.0 = Release|Any CPU
- {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.ActiveCfg = Release|x64
- {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.Build.0 = Release|x64
+ {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.ActiveCfg = Release|Any CPU
+ {E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x64.Build.0 = Release|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x86.ActiveCfg = Release|Any CPU
{E37CD05A-EBFC-429D-A550-BEE44119FA9E}.Release|x86.Build.0 = Release|Any CPU
{7F6C7E7A-A4B5-4D12-88EB-217CA59284F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
diff --git a/docs/migration/v2-migration.md b/docs/migration/v2-migration.md
new file mode 100644
index 000000000..d6a8248f7
--- /dev/null
+++ b/docs/migration/v2-migration.md
@@ -0,0 +1,94 @@
+# Migration plan
+
+This page outlines key changes and important details to consider when migrating. It highlights what’s new, what’s changed, and any steps you need to take to ensure a smooth transition. This isn’t a full step-by-step guide but a quick reference to help you navigate the most critical parts of the migration process.
+
+## Key changes in v2
+
+### Global namespace change
+
+In version 2.0 the namespace has been changed from `WPF-UI` to the more .NET compatible `Wpf.Ui`. The package name has not been changed to maintain branding and consistency.
+
+### Navigation
+
+The navigation control has been rewritten yet again, making it almost completely incompatible.
+
+All navigation controls inherit from `Wpf.Ui.Controls.Navigation.NavigationBase` base class.
+
+```xml
+
+
+
+
+
+
+
+
+
+```
+
+```xml
+
+
+
+
+
+
+
+
+
+```
+
+```xml
+
+
+
+
+
+
+
+
+
+```
+
+### Titlebar
+
+The titlebar control has been rewritten yet again, making it almost completely incompatible.
diff --git a/docs/migration/v3-migration.md b/docs/migration/v3-migration.md
new file mode 100644
index 000000000..82002a5c4
--- /dev/null
+++ b/docs/migration/v3-migration.md
@@ -0,0 +1,19 @@
+# Migration plan
+
+This page outlines key changes and important details to consider when migrating. It highlights what’s new, what’s changed, and any steps you need to take to ensure a smooth transition. This isn’t a full step-by-step guide but a quick reference to help you navigate the most critical parts of the migration process.
+
+## Navigation
+
+All navigation controls have been merged into one `NavigationView`, inspired by Win UI.
+
+## Icons
+
+All icons are based on the new `IconElement` control. They replaced icons in `TitleBar`, `NavigationView`, `Button` and other controls.
+
+## Control Gallery
+
+Inspired by **Win UI Controls Gallery**, a new application for testing and browsing controls was created -** WPF UI Gallery**. It replaced the Demo app.
+
+## Dialogs
+
+`ContentDialog`, `MessageBox` and `Snackbar` have been modified, their interfaces are not fully compatible.
\ No newline at end of file
diff --git a/docs/migration/v4-migration.md b/docs/migration/v4-migration.md
new file mode 100644
index 000000000..613f1d688
--- /dev/null
+++ b/docs/migration/v4-migration.md
@@ -0,0 +1,45 @@
+# Migration plan
+
+This page outlines key changes and important details to consider when migrating. It highlights what’s new, what’s changed, and any steps you need to take to ensure a smooth transition. This isn’t a full step-by-step guide but a quick reference to help you navigate the most critical parts of the migration process.
+
+## Abstractions package
+
+Some WPF UI interfaces have been moved to a standalone package **WPF-UI.Abstractions**. You don't need to reference it, it will always be added automatically with **WPF-UI** NuGet package.
+
+## Navigation interfaces
+
+Navigation interfaces have been moved to a standalone **WPF-UI.Abstractions** package. This way, if you have models, views or other business services in another project, not related to WPF, you can develop them together for multiple applications.
+
+### New namespaces
+
+`INavigationAware` and `INavigableView` have beed moved to `Wpf.Ui.Abstractions.Controls` namespace.
+
+### Dependency injection based page creation
+
+`IPageService` have been renamed to `INavigationViewPageProvider`.
+
+Its default implementation is in the new **Wpf.Ui.DependencyInjection** package. You just need to use the `services.AddNavigationViewPageProvider()` extension and then indicate in the navigation that you want to use this interface. Then `NavigationView` will use DI container for pages creation.
+
+**Program.cs**
+```csharp
+var builder = Host.CreateDefaultBuilder();
+builder.Services.AddNavigationViewPageProvider();
+```
+
+**MyWindow.xaml.cs**
+```csharp
+var pageProvider = serviceProvider.GetRequiredService();
+
+// NavigationControl is x:Name of our NavigationView defined in XAML.
+NavigationControl.SetPageProviderService(pageProvider)
+```
+
+### Navigation service
+
+The `INavigationService` defined in the main package (**WPF-UI**) makes navigation management easy. You can use it for convenient injection between view models. We **HIGHLY** recommend it to be Singleton.
+
+```csharp
+var builder = Host.CreateDefaultBuilder();
+builder.Services.AddNavigationViewPageProvider();
+builder.Services.AddSingleton();
+```
diff --git a/docs/toc.yml b/docs/toc.yml
index 61f9348b2..3cc694620 100644
--- a/docs/toc.yml
+++ b/docs/toc.yml
@@ -28,5 +28,14 @@ items:
href: documentation/releases.md
- name: API v4.0
href: api/
+ - name: Migration
+ href: /migration
+ items:
+ - name: Key changes in v4
+ href: migration/v4-migration.md
+ - name: Key changes in v3
+ href: migration/v3-migration.md
+ - name: Key changes in v2
+ href: migration/v2-migration.md
- name: Support plans
href: https://lepo.co/support
diff --git a/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj b/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj
index 325164a23..7b88443d7 100644
--- a/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj
+++ b/samples/Wpf.Ui.Demo.Dialogs/Wpf.Ui.Demo.Dialogs.csproj
@@ -2,12 +2,11 @@
WinExe
- net8.0-windows10.0.22621.0
+ net9.0-windows10.0.26100.0
10.0.17763.0
true
app.manifest
applicationIcon.ico
- AnyCPU;x64
$(NoWarn);SA1601
diff --git a/samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj b/samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj
index 7e24cbdd1..1667d2fd2 100644
--- a/samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj
+++ b/samples/Wpf.Ui.Demo.Mvvm/Wpf.Ui.Demo.Mvvm.csproj
@@ -2,12 +2,11 @@
WinExe
- net8.0-windows10.0.22621.0
+ net9.0-windows10.0.26100.0
10.0.17763.0
true
app.manifest
applicationIcon.ico
- AnyCPU;x64
$(NoWarn);SA1601
diff --git a/samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj b/samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj
index ea1f29ef8..b57a6eb5c 100644
--- a/samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj
+++ b/samples/Wpf.Ui.Demo.Simple/Wpf.Ui.Demo.Simple.csproj
@@ -2,12 +2,11 @@
WinExe
- net8.0-windows10.0.22621.0
+ net9.0-windows10.0.26100.0
10.0.17763.0
true
app.manifest
applicationIcon.ico
- AnyCPU;x64
$(NoWarn);SA1601
diff --git a/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj b/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj
index 843153ed8..3b3d1266c 100644
--- a/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj
+++ b/src/Wpf.Ui.Extension.Template.Blank/Wpf.Ui.Blank.csproj
@@ -15,7 +15,8 @@
-
+
+
diff --git a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj
index a5785e118..3b3d1266c 100644
--- a/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj
+++ b/src/Wpf.Ui.Extension.Template.Compact/Wpf.Ui.Compact.csproj
@@ -15,8 +15,8 @@
-
-
+
+
diff --git a/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj b/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj
index a5785e118..3b3d1266c 100644
--- a/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj
+++ b/src/Wpf.Ui.Extension.Template.Fluent/Wpf.Ui.Fluent.csproj
@@ -15,8 +15,8 @@
-
-
+
+
diff --git a/src/Wpf.Ui.Gallery.Package/Wpf.Ui.Gallery.Package.wapproj b/src/Wpf.Ui.Gallery.Package/Wpf.Ui.Gallery.Package.wapproj
index aa72c787b..a17ba6af7 100644
--- a/src/Wpf.Ui.Gallery.Package/Wpf.Ui.Gallery.Package.wapproj
+++ b/src/Wpf.Ui.Gallery.Package/Wpf.Ui.Gallery.Package.wapproj
@@ -20,21 +20,13 @@
Release
x64
-
+
Debug
- ARM
+ arm64
-
+
Release
- ARM
-
-
- Debug
- ARM64
-
-
- Release
- ARM64
+ arm64
Debug
@@ -51,18 +43,37 @@
50c713c3-555e-491f-87ee-c806bec0579f
- 10.0.22621.0
- 10.0.14393.0
+ 10.0.26100.0
+ 10.0.18362.0
en-US
false
$(NoWarn);NU1701;NU1702
..\Wpf.Ui.Gallery\Wpf.Ui.Gallery.csproj
True
False
- True
+ False
True
- x86
+ x86|x64|arm64
0
+ SHA256
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
+
+
+ Always
diff --git a/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs b/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs
index 9283f5c26..ecd8de677 100644
--- a/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs
+++ b/src/Wpf.Ui.Gallery/Controllers/MonacoController.cs
@@ -75,6 +75,8 @@ public void DispatchScript(string script)
return;
}
- _ = Application.Current.Dispatcher.InvokeAsync(async () => await _webView!.ExecuteScriptAsync(script));
+ _ = Application.Current.Dispatcher.InvokeAsync(
+ async () => await _webView!.ExecuteScriptAsync(script)
+ );
}
}
diff --git a/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml b/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml
index 11731a532..2600b11c4 100644
--- a/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml
+++ b/src/Wpf.Ui.Gallery/Controls/GalleryNavigationPresenter.xaml
@@ -38,17 +38,17 @@
+ TextWrapping="Wrap" />
+ TextWrapping="Wrap" />
diff --git a/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj b/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj
index 68ecff1ff..6ecc4de7a 100644
--- a/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj
+++ b/src/Wpf.Ui.Gallery/Wpf.Ui.Gallery.csproj
@@ -1,9 +1,9 @@
-
+
Wpf.Ui.Gallery
WinExe
- net9.0-windows10.0.22621.0
+ net9.0-windows10.0.26100.0
10.0.18362.0
true
true
@@ -11,6 +11,7 @@
app.manifest
$(NoWarn);SA1601
True
+ AnyCPU;x86;x64;arm64
diff --git a/src/Wpf.Ui/Controls/Arc/Arc.cs b/src/Wpf.Ui/Controls/Arc/Arc.cs
index e3bd1caf1..4c5cedbc0 100644
--- a/src/Wpf.Ui/Controls/Arc/Arc.cs
+++ b/src/Wpf.Ui/Controls/Arc/Arc.cs
@@ -57,7 +57,8 @@ static Arc()
// Modify the metadata of the StrokeStartLineCap dependency property.
StrokeStartLineCapProperty.OverrideMetadata(
typeof(Arc),
- new PropertyMetadata(PenLineCap.Round, PropertyChangedCallback));
+ new PropertyMetadata(PenLineCap.Round, PropertyChangedCallback)
+ );
}
///
diff --git a/src/Wpf.Ui/Controls/VirtualizingWrapPanel/VirtualizingWrapPanel.cs b/src/Wpf.Ui/Controls/VirtualizingWrapPanel/VirtualizingWrapPanel.cs
index 3392e2dee..1a58d4723 100644
--- a/src/Wpf.Ui/Controls/VirtualizingWrapPanel/VirtualizingWrapPanel.cs
+++ b/src/Wpf.Ui/Controls/VirtualizingWrapPanel/VirtualizingWrapPanel.cs
@@ -425,8 +425,10 @@ protected override ItemRange UpdateItemRange()
int rowCountInCacheBefore = (int)(cacheBeforeInPixel / GetHeight(ChildSize));
int rowCountInCacheAfter =
(
- (int)Math.Ceiling(
- (offsetInPixel + viewportHeight + cacheAfterInPixel) / GetHeight(ChildSize))
+ (int)
+ Math.Ceiling(
+ (offsetInPixel + viewportHeight + cacheAfterInPixel) / GetHeight(ChildSize)
+ )
) - (int)Math.Ceiling((offsetInPixel + viewportHeight) / GetHeight(ChildSize));
startIndex = Math.Max(startIndex - (rowCountInCacheBefore * ItemsPerRowCount), 0);
diff --git a/src/Wpf.Ui/Interop/UnsafeNativeMethods.cs b/src/Wpf.Ui/Interop/UnsafeNativeMethods.cs
index 16239fe5c..be8c6f217 100644
--- a/src/Wpf.Ui/Interop/UnsafeNativeMethods.cs
+++ b/src/Wpf.Ui/Interop/UnsafeNativeMethods.cs
@@ -376,9 +376,7 @@ public static Color GetDwmColor()
return Color.FromArgb(255, values[2], values[1], values[0]);
}
- catch
- {
- }
+ catch { }
}
}
diff --git a/src/Wpf.Ui/Markup/Design.cs b/src/Wpf.Ui/Markup/Design.cs
index 0be96b654..9521d6f0e 100644
--- a/src/Wpf.Ui/Markup/Design.cs
+++ b/src/Wpf.Ui/Markup/Design.cs
@@ -29,10 +29,12 @@ public static class Design
///
private static bool InDesignMode =>
_inDesignMode ??=
- (bool)DependencyPropertyDescriptor
- .FromProperty(DesignerProperties.IsInDesignModeProperty, typeof(FrameworkElement))
- .Metadata.DefaultValue
- || System.Diagnostics.Process.GetCurrentProcess()
+ (bool)
+ DependencyPropertyDescriptor
+ .FromProperty(DesignerProperties.IsInDesignModeProperty, typeof(FrameworkElement))
+ .Metadata.DefaultValue
+ || System
+ .Diagnostics.Process.GetCurrentProcess()
.ProcessName.StartsWith(DesignProcessName, StringComparison.Ordinal);
public static readonly DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached(
diff --git a/src/Wpf.Ui/UiApplication.cs b/src/Wpf.Ui/UiApplication.cs
index abd57e07e..43b1e92f2 100644
--- a/src/Wpf.Ui/UiApplication.cs
+++ b/src/Wpf.Ui/UiApplication.cs
@@ -95,14 +95,11 @@ public ResourceDictionary Resources
_resources.MergedDictionaries.Add(themesDictionary);
_resources.MergedDictionaries.Add(controlsDictionary);
}
- catch
- {
- }
+ catch { }
}
return _application?.Resources ?? _resources;
}
-
set
{
if (_application is not null)
diff --git a/tests/Wpf.Ui.Gallery.UnitTests/Wpf.Ui.Gallery.UnitTests.csproj b/tests/Wpf.Ui.Gallery.UnitTests/Wpf.Ui.Gallery.UnitTests.csproj
index d0047db9f..e251be850 100644
--- a/tests/Wpf.Ui.Gallery.UnitTests/Wpf.Ui.Gallery.UnitTests.csproj
+++ b/tests/Wpf.Ui.Gallery.UnitTests/Wpf.Ui.Gallery.UnitTests.csproj
@@ -1,7 +1,7 @@
- net9.0-windows10.0.22621.0
+ net9.0-windows10.0.26100.0
false