Je vyžadována podpora jazyka JavaScript
Některé stránky na tomto webu vyžadují podporu jazyka JavaScript. Váš webový prohlížeč jazyk JavaScript nepodporuje nebo jazyk JavaScript není povolen.
Chcete-li zjistit, zda webový prohlížeč podporuje jazyk JavaScript nebo jazyk JavaScript chcete povolit, přečtěte si nápovědu k vašemu webovému prohlížeči.
FolderPickerDialog.cs
Download fileToto je zdrojový kód souboru FolderPickerDialog.cs
Vista style Select Folder dialog.
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using IMP.Windows.Interop;
namespace IMP.Windows
{
/// <summary>
/// Prompts the user to select a folder.
/// </summary>
/// <remarks>
/// This class will use the Vista style Select Folder dialog if possible, or the regular FolderBrowserDialog if it is not.
/// </remarks>
public sealed class FolderPickerDialog : ICommonDialog
{
#region WindowHandleWrapper
private class WindowHandleWrapper : System.Windows.Forms.IWin32Window
{
private IntPtr _handle;
public WindowHandleWrapper(IntPtr handle)
{
_handle = handle;
}
#region IWin32Window Members
public IntPtr Handle
{
get { return _handle; }
}
#endregion
}
#endregion
#region member varible and default property initialization
private string m_Title = string.Empty;
private string m_FolderPath = string.Empty;
#endregion
#region constructors and destructors
/// <summary>
/// Creates a new instance of the <see cref="FolderPickerDialog" /> class.
/// </summary>
public FolderPickerDialog() { }
#endregion
#region action methods
public CommonDialogResult ShowDialog()
{
return ShowDialog(IntPtr.Zero);
}
public CommonDialogResult ShowDialog(IntPtr hwndOwner)
{
if (hwndOwner == IntPtr.Zero)
{
hwndOwner = CommonDialogNativeMethods.GetActiveWindow();
}
if (hwndOwner == IntPtr.Zero)
{
throw new InvalidOperationException("Owner handler is not set and cannot be determined!");
}
if (IsVistaOrLater)
{
return RunVistaNativeDialog(hwndOwner);
}
else
{
return RunLegacyDialog(hwndOwner);
}
}
#endregion
#region property getters/setters
/// <summary>
/// Gets or sets the dialog title.
/// </summary>
/// <value>Dialog title.</value>
[Localizable(true), DefaultValue(""), Browsable(true), Description("Dialog title."), Category("Appearance")]
public string Title
{
get { return m_Title; }
set
{
m_Title = (value == null) ? string.Empty : value;
}
}
/// <summary>
/// Gets or sets the folder path selected in dialog.
/// </summary>
/// <value>Selected folder path.</value>
[DefaultValue(""), Browsable(true), Description("Folder path selected in dialog."), Category("Folder Browsing")]
public string FolderPath
{
get { return m_FolderPath; }
set
{
m_FolderPath = (value == null) ? string.Empty : value;
}
}
private static bool IsVistaOrLater
{
get { return Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major > 5; }
}
#endregion
#region private member functions
private CommonDialogResult RunVistaNativeDialog(IntPtr hwndOwner)
{
var nativeFileOpenDialog = new NativeFileOpenDialog();
SetNativeDialogProperties(nativeFileOpenDialog);
try
{
int hresult = nativeFileOpenDialog.Show(hwndOwner);
//Create return information.
if (hresult < 0)
{
if ((uint)hresult == (uint)HRESULT.E_ERROR_CANCELLED)
{
return CommonDialogResult.Cancel;
}
throw Marshal.GetExceptionForHR(hresult);
}
GetNativeDialogResult(nativeFileOpenDialog);
return CommonDialogResult.OK;
}
finally
{
if (nativeFileOpenDialog != null)
{
Marshal.FinalReleaseComObject(nativeFileOpenDialog);
}
}
}
private void SetNativeDialogProperties(NativeFileOpenDialog nativeFileOpenDialog)
{
//Set Title
if (!string.IsNullOrEmpty(m_Title))
{
nativeFileOpenDialog.SetTitle(m_Title);
}
//Set Folder
if (!string.IsNullOrEmpty(m_FolderPath))
{
if (System.IO.Directory.Exists(m_FolderPath))
{
nativeFileOpenDialog.SetFolder(CreateShellItemFromParsingName(m_FolderPath));
}
else
{
string parent = System.IO.Path.GetDirectoryName(m_FolderPath);
if (parent != null && System.IO.Directory.Exists(parent))
{
string folder = System.IO.Path.GetFileName(m_FolderPath);
nativeFileOpenDialog.SetFolder(CreateShellItemFromParsingName(parent));
nativeFileOpenDialog.SetFileName(folder);
}
}
}
//Apply option bitflags
nativeFileOpenDialog.SetOptions(GetNativeDialogFlags());
}
private CommonDialogNativeMethods.FOS GetNativeDialogFlags()
{
var flags = CommonDialogNativeMethods.FOS.FOS_NOTESTFILECREATE | CommonDialogNativeMethods.FOS.FOS_FORCEFILESYSTEM //Only File System
| CommonDialogNativeMethods.FOS.FOS_FILEMUSTEXIST | CommonDialogNativeMethods.FOS.FOS_PATHMUSTEXIST
| CommonDialogNativeMethods.FOS.FOS_PICKFOLDERS; // Folder Picker
return flags;
}
private void GetNativeDialogResult(NativeFileOpenDialog nativeFileOpenDialog)
{
IShellItem item;
nativeFileOpenDialog.GetResult(out item);
item.GetDisplayName(CommonDialogNativeMethods.SIGDN.SIGDN_FILESYSPATH, out m_FolderPath);
}
private static IShellItem CreateShellItemFromParsingName(string path)
{
object nativeShellItem;
Guid guid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"); //IID_IShellItem
int hr = CommonDialogNativeMethods.SHCreateItemFromParsingName(path, IntPtr.Zero, ref guid, out nativeShellItem);
if (nativeShellItem == null || hr < 0)
{
throw new ExternalException("Shell item could not be created.", Marshal.GetExceptionForHR(hr));
}
return (IShellItem)nativeShellItem;
}
private CommonDialogResult RunLegacyDialog(IntPtr hwndOwner)
{
var fbd = new Ionic.Utils.FolderBrowserDialogEx()
{
ShowNewFolderButton = true,
Description = m_Title,
SelectedPath = m_FolderPath
};
var result = fbd.ShowDialog(new WindowHandleWrapper(hwndOwner));
if (result != System.Windows.Forms.DialogResult.OK)
{
return CommonDialogResult.Cancel;
}
m_FolderPath = fbd.SelectedPath;
return CommonDialogResult.OK;
}
#endregion
}
}