簡體   English   中英

如何在自制Windows資源管理器中正確顯示圖標?

[英]How to properly display icons in selfmade Windows Explorer?

圖標未顯示![] [1] 我正在使用C#WinForms。 我已經制作了一個Windows資源管理器,其中顯示了邏輯目錄,然后在單擊它們時,便在ListView中顯示了其中的文件(舊但棘手的東西)。 我使用以下命令從系統中獲取圖標:

Icon iconForFile = SystemIcons.WinLogo;
ListViewItem lv = new ListViewItem(filData, imageList1.Images.Count);
lv.Tag = file;
iconForFile = Icon.ExtractAssociatedIcon(file);
string Extension = Path.GetExtension(file);

if (!imageList1.Images.ContainsKey(file))
{
    // If not, add the image to the image list.
    iconForFile = System.Drawing.Icon.ExtractAssociatedIcon(file);
    imageList1.Images.Add(file, iconForFile);
}

lv.ImageKey = file;
listView1.SmallImageList = imageList1;

現在的問題是:單擊第一級目錄時確實顯示圖標,但是當我單擊任何目錄中的文件夾(即“ C”)時,它不在目錄的子文件夾中顯示圖標。 請幫助我如何自定義它。 我的完整代碼有點像這樣:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        PopulateTreeView(treeView1);
    }

    private void PopulateTreeView(TreeView tv)
    {
        string[] drives = Environment.GetLogicalDrives();
        TreeNode MyCnode = new TreeNode();
        MyCnode = new TreeNode("My Computer");
        tv.Nodes.Add(MyCnode);   
        foreach (string drive in drives)
        {
            TreeNode nodeDrive = new TreeNode();
            nodeDrive.Tag = drive;
            nodeDrive.Text = drive;
            tv.Nodes.Add(nodeDrive);
            // tv.Nodes.Add();
            // nodeDrive.EnsureVisible();
            //  treeView1.Refresh();

            try
            {
                //add dirs under drive
                if (Directory.Exists(drive))
                {
                    foreach (string dir in Directory.GetDirectories(drive))
                    {
                        TreeNode node = new TreeNode();
                        node.Tag = dir;
                        node.Text = dir.Substring(dir.LastIndexOf(@"\") + 1);
                        node.ImageIndex = 1;
                        nodeDrive.Nodes.Add(node);
                    }
                }

            }
            catch (Exception)    
            {
            }
            MyCnode.Expand();
        }
    }

    public TreeNode GetDirectory(TreeNode parentNode)
    {

        DirectoryInfo d = new DirectoryInfo(parentNode.FullPath);
        DirectoryInfo[] dInfo = d.GetDirectories()
                                  .Where(di => !di.Attributes.HasFlag(FileAttributes.System))

                                  .Where(di => !di.Attributes.HasFlag(FileAttributes.Hidden))
                                  .ToArray();

        parentNode.Nodes.Clear();
        if (dInfo.Length > 0)
        {
            TreeNode treeNode = new TreeNode();

            foreach (DirectoryInfo driSub in dInfo)
            {

                treeNode = parentNode.Nodes.Add(driSub.Name);
                treeNode.Nodes.Add("");

            }
        }

        return parentNode;
    }

    private void AddFiles(string strPath)
    {
        try
        {
            listView1.BeginUpdate();
            listView1.Items.Clear();
            //headers listview
           // listView1.Columns.Add("File Name", 200);
            //listView1.Columns.Add("Size", 80);
            //listView1.Columns.Add("Last Accessed", 110);

            string[] dirData = new string[3];
            string[] filData = new string[3];
            string[] files = Directory.GetFiles(strPath);
            foreach (string file in files)
            {
                FileInfo finfo = new FileInfo(file);
                FileAttributes fatr = finfo.Attributes;
                string name = Path.GetFileNameWithoutExtension(file);
                filData[0] = name;
                filData[1] = finfo.Length.ToString();
                filData[2] = File.GetLastAccessTime(file).ToString();
                // Set a default icon for the file.
                Icon iconForFile = SystemIcons.WinLogo;
                ListViewItem lv = new ListViewItem(filData, imageList1.Images.Count);
                lv.Tag = file;
                iconForFile = Icon.ExtractAssociatedIcon(file);
                string Extension = Path.GetExtension(file);
                if (!imageList1.Images.ContainsKey(file))
                {
                    // If not, add the image to the image list.
                    iconForFile = System.Drawing.Icon.ExtractAssociatedIcon(file);
                    imageList1.Images.Add(file, iconForFile);
                }
                lv.ImageKey = file;

                listView1.SmallImageList = imageList1;
                listView1.Items.Add(lv);
            }
        }

        catch (Exception Exc) { MessageBox.Show(Exc.ToString()); }

        listView1.EndUpdate();
    }

    private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        string pathdoubleClicked = listView1.FocusedItem.Tag.ToString();

        Process.Start(pathdoubleClicked);
    }

    private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
    {
        GetDirectory(e.Node);
        treeView1.SelectedNode.Expand();
        AddFiles(e.Node.FullPath.ToString());
    }
}

對於仍將其視為搜索答案的任何人,需要在將項目添加到圖像列表之前完成圖像列表的分配。

private void AddFiles(string strPath)
{
    try
    {
        listView1.BeginUpdate();
        listView1.Items.Clear();
        listView1.SmallImageList = imageList1;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM