This repository has been archived by the owner on Feb 4, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 9
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Fix import - Use the custom class OpenFolderDialog instead of OpenFileDialog for selecting the Bundles2 folder to import.
- Loading branch information
Showing
5 changed files
with
165 additions
and
27 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,154 @@ | ||
using System; | ||
using System.Diagnostics; | ||
using System.Runtime.InteropServices; | ||
using System.Windows; | ||
using System.Windows.Interop; | ||
|
||
namespace VisualBundle | ||
{ | ||
|
||
#region FolderBrowserDialog Base | ||
|
||
/// <summary> | ||
/// Vista 樣式的 FolderBrowserDialog | ||
/// </summary> | ||
public class OpenFolderDialog | ||
{ | ||
#region Public Property | ||
/// <summary> | ||
/// 获取在 FolderBrowser 中选择的文件夹路径 | ||
/// </summary> | ||
public string DirectoryPath { get; set; } | ||
/// <summary> | ||
/// 向用户显示 FolderBrowser 的对话框 | ||
/// </summary> | ||
/// <param name="owner">任何实现 System.Windows.Forms.IWin32Window(表示将拥有模式对话框的顶级窗口)的对象。</param> | ||
/// <returns></returns> | ||
public bool? ShowDialog(Window owner = null) | ||
{ | ||
; | ||
IntPtr hwndOwner = owner != null ? new WindowInteropHelper(owner).Handle : Process.GetCurrentProcess().MainWindowHandle; | ||
IFileOpenDialog dialog = (IFileOpenDialog)new FileOpenDialog(); | ||
try | ||
{ | ||
IShellItem item; | ||
if (!string.IsNullOrEmpty(DirectoryPath)) | ||
{ | ||
uint atts = 0; | ||
if (SHILCreateFromPath(DirectoryPath, out IntPtr idl, ref atts) == 0) | ||
if (SHCreateShellItem(IntPtr.Zero, IntPtr.Zero, idl, out item) == 0) | ||
dialog.SetFolder(item); | ||
} | ||
dialog.SetOptions(FOS.FOS_PICKFOLDERS | FOS.FOS_FORCEFILESYSTEM); | ||
uint hr = dialog.Show(hwndOwner); | ||
if (hr == ERROR_CANCELLED) | ||
return false; | ||
if (hr != 0) | ||
return null; | ||
dialog.GetResult(out item); | ||
item.GetDisplayName(SIGDN.SIGDN_FILESYSPATH, out string path); | ||
DirectoryPath = path; | ||
return true; | ||
} | ||
finally | ||
{ | ||
Marshal.ReleaseComObject(dialog); | ||
} | ||
} | ||
#endregion | ||
|
||
#region BaseType | ||
[DllImport("shell32.dll")] | ||
private static extern int SHILCreateFromPath([MarshalAs(UnmanagedType.LPWStr)] string pszPath, out IntPtr ppIdl, ref uint rgflnOut); | ||
[DllImport("shell32.dll")] | ||
private static extern int SHCreateShellItem(IntPtr pidlParent, IntPtr psfParent, IntPtr pidl, out IShellItem ppsi); | ||
private const uint ERROR_CANCELLED = 0x800704C7; | ||
[ComImport] | ||
[Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")] | ||
private class FileOpenDialog | ||
{ | ||
} | ||
[ComImport] | ||
[Guid("42f85136-db7e-439c-85f1-e4075d135fc8")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
private interface IFileOpenDialog | ||
{ | ||
[PreserveSig] | ||
uint Show([In] IntPtr parent); // IModalWindow | ||
void SetFileTypes(); // not fully defined | ||
void SetFileTypeIndex([In] uint iFileType); | ||
void GetFileTypeIndex(out uint piFileType); | ||
void Advise(); // not fully defined | ||
void Unadvise(); | ||
void SetOptions([In] FOS fos); | ||
void GetOptions(out FOS pfos); | ||
void SetDefaultFolder(IShellItem psi); | ||
void SetFolder(IShellItem psi); | ||
void GetFolder(out IShellItem ppsi); | ||
void GetCurrentSelection(out IShellItem ppsi); | ||
void SetFileName([In, MarshalAs(UnmanagedType.LPWStr)] string pszName); | ||
void GetFileName([MarshalAs(UnmanagedType.LPWStr)] out string pszName); | ||
void SetTitle([In, MarshalAs(UnmanagedType.LPWStr)] string pszTitle); | ||
void SetOkButtonLabel([In, MarshalAs(UnmanagedType.LPWStr)] string pszText); | ||
void SetFileNameLabel([In, MarshalAs(UnmanagedType.LPWStr)] string pszLabel); | ||
void GetResult(out IShellItem ppsi); | ||
void AddPlace(IShellItem psi, int alignment); | ||
void SetDefaultExtension([In, MarshalAs(UnmanagedType.LPWStr)] string pszDefaultExtension); | ||
void Close(int hr); | ||
void SetClientGuid(); // not fully defined | ||
void ClearClientData(); | ||
void SetFilter([MarshalAs(UnmanagedType.Interface)] IntPtr pFilter); | ||
void GetResults([MarshalAs(UnmanagedType.Interface)] out IntPtr ppenum); // not fully defined | ||
void GetSelectedItems([MarshalAs(UnmanagedType.Interface)] out IntPtr ppsai); // not fully defined | ||
} | ||
[ComImport] | ||
[Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE")] | ||
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] | ||
private interface IShellItem | ||
{ | ||
void BindToHandler(); // not fully defined | ||
void GetParent(); // not fully defined | ||
void GetDisplayName([In] SIGDN sigdnName, [MarshalAs(UnmanagedType.LPWStr)] out string ppszName); | ||
void GetAttributes(); // not fully defined | ||
void Compare(); // not fully defined | ||
} | ||
private enum SIGDN : uint | ||
{ | ||
SIGDN_DESKTOPABSOLUTEEDITING = 0x8004c000, | ||
SIGDN_DESKTOPABSOLUTEPARSING = 0x80028000, | ||
SIGDN_FILESYSPATH = 0x80058000, | ||
SIGDN_NORMALDISPLAY = 0, | ||
SIGDN_PARENTRELATIVE = 0x80080001, | ||
SIGDN_PARENTRELATIVEEDITING = 0x80031001, | ||
SIGDN_PARENTRELATIVEFORADDRESSBAR = 0x8007c001, | ||
SIGDN_PARENTRELATIVEPARSING = 0x80018001, | ||
SIGDN_URL = 0x80068000 | ||
} | ||
[Flags] | ||
private enum FOS | ||
{ | ||
FOS_ALLNONSTORAGEITEMS = 0x80, | ||
FOS_ALLOWMULTISELECT = 0x200, | ||
FOS_CREATEPROMPT = 0x2000, | ||
FOS_DEFAULTNOMINIMODE = 0x20000000, | ||
FOS_DONTADDTORECENT = 0x2000000, | ||
FOS_FILEMUSTEXIST = 0x1000, | ||
FOS_FORCEFILESYSTEM = 0x40, | ||
FOS_FORCESHOWHIDDEN = 0x10000000, | ||
FOS_HIDEMRUPLACES = 0x20000, | ||
FOS_HIDEPINNEDPLACES = 0x40000, | ||
FOS_NOCHANGEDIR = 8, | ||
FOS_NODEREFERENCELINKS = 0x100000, | ||
FOS_NOREADONLYRETURN = 0x8000, | ||
FOS_NOTESTFILECREATE = 0x10000, | ||
FOS_NOVALIDATE = 0x100, | ||
FOS_OVERWRITEPROMPT = 2, | ||
FOS_PATHMUSTEXIST = 0x800, | ||
FOS_PICKFOLDERS = 0x20, | ||
FOS_SHAREAWARE = 0x4000, | ||
FOS_STRICTFILETYPES = 4 | ||
} | ||
#endregion | ||
} | ||
#endregion | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters