#region 委派及相关方法
private delegate void SetBoolDelegate(bool formOnTop);
private void SetBoolFlag(SetBoolDelegate myDelegate, bool flag)
{
if (this.InvokeRequired)
{
this.Invoke(myDelegate, flag);
}
else
{
myDelegate(flag);
}
}
/// <summary>
/// 窗口浮动于顶层
/// </summary>
///<param name="flag">是否浮动于最上层</param>
private void FormOnTop(bool flag)
{
this.TopMost = flag;
}
private delegate void SetStrDelegate(string text);
private void SetText(SetStrDelegate myDelegate, string text)
{
if (this.InvokeRequired)
{
this.Invoke(myDelegate, text);
}
else
{
myDelegate(text);
}
}
/// <summary>
/// 更新提示信息
/// </summary>
/// <param name="text">信息内容</param>
private void UpdateInfoLabel(string text)
{
this.labStatusMessage.Text = text;
}
/// <summary>
/// 更新当前目录信息
/// </summary>
/// <param name="path"></param>
private delegate void UpdateListDelegate(string path);
/// <summary>
/// 更新列表(列出当前目录下的目录和文件)
/// </summary>
/// <param name="newPath">路径</param>
private void UpdateList(string newPath)
{
if (newPath == "")
{
ListDrivers();
}
else
{
try
{
DirectoryInfo currentDir = new DirectoryInfo(newPath);
DirectoryInfo[] dirs = currentDir.GetDirectories(); //获取目录
FileInfo[] files = currentDir.GetFiles(); //获取文件
//删除ImageList中的程序图标
foreach (ListViewItem item in listViewContent.Items)
{
if (item.Text.EndsWith(".exe")) //是程序
{
imageListSmall.Images.RemoveByKey(item.Text);
imageListLarge.Images.RemoveByKey(item.Text);
}
}
listViewContent.Items.Clear();
//列出文件夹
foreach (DirectoryInfo dir in dirs)
{
ListViewItem dirItem = listViewContent.Items.Add(dir.Name, 2);
dirItem.Name = dir.FullName;
dirItem.SubItems.Add("");
dirItem.SubItems.Add("文件夹");
dirItem.SubItems.Add(dir.LastWriteTimeUtc.ToString());
}
//列出文件
foreach (FileInfo file in files)
{
ListViewItem fileItem = listViewContent.Items.Add(file.Name);
if (file.Extension == ".exe" || file.Extension == "") //程序文件或无扩展名
{
Icon fileIcon = GetSystemIcon.GetIconByFileName(file.FullName);
imageListSmall.Images.Add(file.Name, fileIcon);
imageListLarge.Images.Add(file.Name, fileIcon);
fileItem.ImageKey = file.Name;
}
else //其它文件
{
if (!imageListSmall.Images.ContainsKey(file.Extension)) //ImageList中不存在此类图标
{
Icon fileIcon = GetSystemIcon.GetIconByFileName(file.FullName);
imageListSmall.Images.Add(file.Extension, fileIcon);
imageListLarge.Images.Add(file.Extension, fileIcon);
}
fileItem.ImageKey = file.Extension;
}
fileItem.Name = file.FullName;
fileItem.SubItems.Add(file.Length.ToString() + "字节");
fileItem.SubItems.Add(file.Extension);
fileItem.SubItems.Add(file.LastWriteTimeUtc.ToString());
}
CurrentPath = newPath;
tspCboxPath.Text = CurrentPath; //更新地址栏
labStatusStatistics.Text = listViewContent.Items.Count + "个对象"; //更新状态栏
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
delegate string GetStrDelegate();
private string GetText(GetStrDelegate myDelegate)
{
if (this.InvokeRequired)
{
return (string)this.Invoke(myDelegate);
}
else
{
return myDelegate();
}
}
#endregion
使用:
this.SetBoolFlag(FormOnTop, false);
this.SetText(UpdateInfoLabel, "文件已经被粉碎!");
string strUri = this.GetText(GetComboBoxWebText);
或者:(当方法比较复杂的时候)
Invoke(new UpdateListDelegate(UpdateList), CurrentDirectoryName);