diff --git a/WPFSamples.sln b/WPFSamples.sln
index 14ca8d6cf..5bd2e21d6 100644
--- a/WPFSamples.sln
+++ b/WPFSamples.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.28927.53
+# Visual Studio Version 17
+VisualStudioVersion = 17.7.33711.374
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Sample Applications", "Sample Applications", "{122369C4-906B-4398-9F7D-DA33916262CF}"
EndProject
@@ -519,6 +519,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SpellChecking", "Documents\
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomDictionaries", "Documents\Spell Checking\CustomDictionaries\CustomDictionaries.csproj", "{CF0B6854-6CA8-4BAC-AF72-E97AE1E54593}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonDialogs", "Windows\CommonDialog\CommonDialogs.csproj", "{41E866EB-A376-47B0-AADA-FC59ACE90A69}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -3858,6 +3860,22 @@ Global
{CF0B6854-6CA8-4BAC-AF72-E97AE1E54593}.Release|x64.Build.0 = Release|Any CPU
{CF0B6854-6CA8-4BAC-AF72-E97AE1E54593}.Release|x86.ActiveCfg = Release|Any CPU
{CF0B6854-6CA8-4BAC-AF72-E97AE1E54593}.Release|x86.Build.0 = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|ARM64.ActiveCfg = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|ARM64.Build.0 = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|x64.Build.0 = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Debug|x86.Build.0 = Debug|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|Any CPU.Build.0 = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|ARM64.ActiveCfg = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|ARM64.Build.0 = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|x64.ActiveCfg = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|x64.Build.0 = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|x86.ActiveCfg = Release|Any CPU
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -4113,6 +4131,7 @@ Global
{8B9A2506-290B-4E20-ABA9-05A89F020809} = {F9BFF0BB-9124-49AE-8482-32A126D58AD2}
{74949E7C-71B0-4E03-8EC3-7CCA9E01397D} = {8B9A2506-290B-4E20-ABA9-05A89F020809}
{CF0B6854-6CA8-4BAC-AF72-E97AE1E54593} = {8B9A2506-290B-4E20-ABA9-05A89F020809}
+ {41E866EB-A376-47B0-AADA-FC59ACE90A69} = {168E363A-7B91-4FBF-A393-28BD29C818DA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5999CD15-1B95-49B3-AD12-5FDC10B2FBAD}
diff --git a/Windows/CommonDialog/App.xaml b/Windows/CommonDialog/App.xaml
new file mode 100644
index 000000000..bafb5877e
--- /dev/null
+++ b/Windows/CommonDialog/App.xaml
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/Windows/CommonDialog/App.xaml.cs b/Windows/CommonDialog/App.xaml.cs
new file mode 100644
index 000000000..b3f2a9644
--- /dev/null
+++ b/Windows/CommonDialog/App.xaml.cs
@@ -0,0 +1,13 @@
+using System.Configuration;
+using System.Data;
+using System.Windows;
+
+namespace CommonDialog
+{
+ ///
+ /// Interaction logic for App.xaml
+ ///
+ public partial class App : Application
+ {
+ }
+}
\ No newline at end of file
diff --git a/Windows/CommonDialog/AssemblyInfo.cs b/Windows/CommonDialog/AssemblyInfo.cs
new file mode 100644
index 000000000..b0ec82757
--- /dev/null
+++ b/Windows/CommonDialog/AssemblyInfo.cs
@@ -0,0 +1,10 @@
+using System.Windows;
+
+[assembly: ThemeInfo(
+ ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
+ //(used if a resource is not found in the page,
+ // or application resource dictionaries)
+ ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
+ //(used if a resource is not found in the page,
+ // app, or any theme specific resource dictionaries)
+)]
diff --git a/Windows/CommonDialog/CommonDialogs.csproj b/Windows/CommonDialog/CommonDialogs.csproj
new file mode 100644
index 000000000..93ef07b19
--- /dev/null
+++ b/Windows/CommonDialog/CommonDialogs.csproj
@@ -0,0 +1,70 @@
+
+
+ net8.0-windows
+ enable
+ enable
+ false
+ true
+
+
+ Debug
+ AnyCPU
+ {F1A89776-516D-4196-9E4F-1F92090E8D5B}
+ WinExe
+ Properties
+ CommonDialogs
+ CommonDialogs
+ 512
+ 4
+ true
+
+
+ AnyCPU
+ true
+ portable
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ MSBuild:Compile
+ Designer
+
+
+ MSBuild:Compile
+ Designer
+
+
+ App.xaml
+ Code
+
+
+
+ MainWindow.xaml
+ Code
+
+
+
+
+
+
+
+
diff --git a/Windows/CommonDialog/DialogDataModel.cs b/Windows/CommonDialog/DialogDataModel.cs
new file mode 100644
index 000000000..8e26454c9
--- /dev/null
+++ b/Windows/CommonDialog/DialogDataModel.cs
@@ -0,0 +1,64 @@
+using System.ComponentModel;
+
+namespace CommonDialogs
+{
+ class DialogDataModel : INotifyPropertyChanged
+ {
+ # region Data Fields and Properties
+
+ private string resultTitle = "";
+ private string resultBody = "";
+ private string dialogDescription = "";
+ private string clickOperationDescription = "";
+
+ public string ResultTitle
+ {
+ get => resultTitle;
+ set
+ {
+ resultTitle = value;
+ OnPropertyChanged(nameof(ResultTitle));
+ }
+ }
+
+ public string ResultBody
+ {
+ get => resultBody;
+ set
+ {
+ resultBody = value;
+ OnPropertyChanged(nameof(ResultBody));
+ }
+ }
+
+ public string DialogDescription
+ {
+ get => dialogDescription;
+ set
+ {
+ dialogDescription = value;
+ OnPropertyChanged(nameof(DialogDescription));
+ }
+ }
+
+ public string ClickOperationDescription
+ {
+ get => clickOperationDescription;
+ set
+ {
+ clickOperationDescription = value;
+ OnPropertyChanged(nameof(ClickOperationDescription));
+ }
+ }
+
+ #endregion
+
+ private void OnPropertyChanged(string v)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v));
+ }
+
+ public event PropertyChangedEventHandler? PropertyChanged;
+
+ }
+}
diff --git a/Windows/CommonDialog/MainWindow.xaml b/Windows/CommonDialog/MainWindow.xaml
new file mode 100644
index 000000000..fd87d3637
--- /dev/null
+++ b/Windows/CommonDialog/MainWindow.xaml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+ WPF Dialogs Sample
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Windows/CommonDialog/MainWindow.xaml.cs b/Windows/CommonDialog/MainWindow.xaml.cs
new file mode 100644
index 000000000..0c1d3be6f
--- /dev/null
+++ b/Windows/CommonDialog/MainWindow.xaml.cs
@@ -0,0 +1,29 @@
+using System.ComponentModel;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+using Microsoft.Win32;
+using static System.Net.Mime.MediaTypeNames;
+
+namespace CommonDialogs
+{
+ ///
+ /// Interaction logic for MainWindow.xaml
+ ///
+ public partial class MainWindow : Window
+ {
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Windows/CommonDialog/MainWindowViewModel.cs b/Windows/CommonDialog/MainWindowViewModel.cs
new file mode 100644
index 000000000..d544354fa
--- /dev/null
+++ b/Windows/CommonDialog/MainWindowViewModel.cs
@@ -0,0 +1,189 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Input;
+using Microsoft.Win32;
+
+namespace CommonDialogs
+{
+ class MainWindowViewModel
+ {
+ public DialogDataModel Data { get; }
+
+ #region Commands
+
+ public ICommand OpenFileCommand { get;}
+ public ICommand SaveFileCommand { get;}
+ public ICommand OpenFolderCommand { get;}
+
+ #endregion
+
+ public MainWindowViewModel()
+ {
+ Data = new DialogDataModel();
+ OpenFileCommand = new RelayCommand