Mobile 上的文件选择对话框
先前的一个项目中需要从mobile中选择相片,使用的Microsoft.WindowsMobile.Forms.SelectPictureDialog组件,前面没发现什么问题,可是后来越来越多用户反映按“选择”按钮没反应,自己测试又重现不了
。实地去看了下,才明白,使用了一段时间以后,客户端的数据量增大,程序运行时,缓存的数据越来越多,所占系统内存越大,导致选择相片的对话框无法显示,一闪而过。而CF里面的OpenFileDialog因为mobile的安全限制,只能访问my Document下的文件。于是想寻找一个mobile上的文件选择对话框组件。在codeproject上发现一个不错,可惜是老外用c++写的,并没有COM组件化,CF无法使用。干脆自己写一个。效果如下图


考虑mobile上的性能,初始化树的时候采用了逐层加载,当展开某个节点时才加载下一层次的结构。
取文件夹图标和文件图标用到了GetFileInfo api,在http://pinvoke.net/上有该函数的C#调用示例。
#region GetIconByFileName
[DllImport("coredll.dll", EntryPoint = "SHGetFileInfo")]
public static extern int GetFileInfo(string pszPath, int dwFileAttributes, ref FileInfoStruct psfi, int cbFileInfo, int uFlags);
[StructLayout(LayoutKind.Sequential)]
public struct FileInfoStruct
{
public IntPtr hIcon;
public int iIcon;
public int dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
public enum FileInfoFlags : int
{
SHGFI_ICON = 0x000000100, // get icon
SHGFI_DISPLAYNAME = 0x000000200, // get display name
SHGFI_TYPENAME = 0x000000400, // get type name
SHGFI_ATTRIBUTES = 0x000000800, // get attributes
SHGFI_ICONLOCATION = 0x000001000, // get icon location
SHGFI_EXETYPE = 0x000002000, // return exe type
SHGFI_SYSICONINDEX = 0x000004000, // get system icon index
SHGFI_LINKOVERLAY = 0x000008000, // put a link overlay on icon SHGFI_SELECTED = 0x000010000 , // show icon in selected state
SHGFI_ATTR_SPECIFIED = 0x000020000, // get only specified attributes
SHGFI_LARGEICON = 0x000000000, // get large icon
SHGFI_SMALLICON = 0x000000001, // get small icon
SHGFI_OPENICON = 0x000000002, // get open icon
SHGFI_SHELLICONSIZE = 0x000000004, // get shell size icon
SHGFI_PIDL = 0x000000008, // pszPath is a pidl
SHGFI_USEFILEATTRIBUTES = 0x000000010, // use passed dwFileAttribute
SHGFI_ADDOVERLAYS = 0x000000020, // apply the appropriate overlays
SHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay
}
private Icon GetIconByFileName(string path)
{
FileInfoStruct _info = new FileInfoStruct();
GetFileInfo(path, 0, ref _info, Marshal.SizeOf(_info),
(int)(FileInfoFlags.SHGFI_ICON | FileInfoFlags.SHGFI_SMALLICON));
return Icon.FromHandle(_info.hIcon);
}
#endregion
节点展开的时候,特殊处理了windows文件夹,在mobile上打开这个系统文件夹很慢,如果没有特殊要求,可以将
SystemEnabled 属性设置为false.
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
{
if (SystemEnabled == false && e.Node.Text.ToLower() == "windows")
{
e.Cancel = true;
return;
}
if (e.Action == TreeViewAction.Expand)
{
e.Node.Nodes.Clear();
listView1.Items.Clear();
imageList2.Images.Clear();
string path = e.Node.FullPath.Replace("\\\\", @"\");
AddNode(e.Node, new DirectoryInfo(path));
}
}
浙公网安备 33010602011771号