diff --git a/src/Windows/Perspex.Win32/SystemDialogImpl.cs b/src/Windows/Perspex.Win32/SystemDialogImpl.cs index 7ba493b3d3..f237665299 100644 --- a/src/Windows/Perspex.Win32/SystemDialogImpl.cs +++ b/src/Windows/Perspex.Win32/SystemDialogImpl.cs @@ -40,10 +40,12 @@ namespace Perspex.Win32 filters.CopyTo(0, filterBuffer, 0, filterBuffer.Length); var defExt = (dialog as SaveFileDialog)?.DefaultExtension; - var buffer = new char[256]; - dialog.InitialFileName?.CopyTo(0, buffer, 0, dialog.InitialFileName.Length); + var fileBuffer = new char[256]; + dialog.InitialFileName?.CopyTo(0, fileBuffer, 0, dialog.InitialFileName.Length); - fixed (char* pBuffer = buffer) + string userSelectedExt = null; + + fixed (char* pFileBuffer = fileBuffer) fixed (char* pFilterBuffer = filterBuffer) fixed (char* pDefExt = defExt) fixed (char* pInitDir = dialog.InitialDirectory) @@ -60,13 +62,13 @@ namespace Perspex.Win32 UnmanagedMethods.OpenFileNameFlags.OFN_EXPLORER | UnmanagedMethods.OpenFileNameFlags.OFN_HIDEREADONLY, nMaxCustFilter = 0, - nMaxFile = buffer.Length - 1, + nMaxFile = fileBuffer.Length - 1, nMaxFileTitle = 0, lpTemplateName = IntPtr.Zero, lpfnHook = IntPtr.Zero, lpstrCustomFilter = IntPtr.Zero, lpstrDefExt = new IntPtr(pDefExt), - lpstrFile = new IntPtr(pBuffer), + lpstrFile = new IntPtr(pFileBuffer), lpstrFileTitle = IntPtr.Zero, lpstrFilter = new IntPtr(pFilterBuffer), lpstrInitialDir = new IntPtr(pInitDir), @@ -89,19 +91,20 @@ namespace Perspex.Win32 if (!res) return null; + userSelectedExt = dialog.Filters[ofn.nFilterIndex - 1].Extensions[0]; } var cStart = 0; string dir = null; var files = new List(); - for (var c = 0; c < buffer.Length; c++) + for (var c = 0; c < fileBuffer.Length; c++) { - if (buffer[c] == 0) + if (fileBuffer[c] == 0) { //Encountered double zero char if (cStart == c) break; - var s = new string(buffer, cStart, c - cStart); + var s = new string(fileBuffer, cStart, c - cStart); if (dir == null) dir = s; else @@ -110,7 +113,17 @@ namespace Perspex.Win32 } } if (files.Count == 0) + { + if (dialog is SaveFileDialog) + { + if (string.IsNullOrWhiteSpace(Path.GetExtension(dir)) && + !string.IsNullOrWhiteSpace(userSelectedExt) && + !userSelectedExt.Contains("*")) + dir = Path.ChangeExtension(dir, userSelectedExt); + } + return new[] {dir}; + } return files.Select(f => Path.Combine(dir, f)).ToArray(); });