5

我是编程和 C# 的新手,似乎对上述内容有点困惑。我想要做的是为客厅媒体电脑创建一个前端,没什么好开始的,因为我知道这对于像我这样的菜鸟来说是一项艰巨的任务。我已经四处张望,并且对启动外部 exe、存储/加载资源等非常满意。我对我 2 周冲浪的结果感到非常满意。

所以我通过启动一个模拟器来开始我的项目,我想做的是扫描一个文件夹中的 zip 文件和图像文件,如果它找到匹配的图像和 zip 文件,它会在每个列表视图中显示一个图像拉链找到。

所以我像这样填充我的列表框并让我的 2 个列表框显示我想看到的东西。

PopulateListBox(listBox1, "\\SomePath\\", "*.zip");
PopulateListBox(listBox2, "\\Images\\", "*.jpg");

private void PopulateListBox(ListBox lsb, string Folder, string FileType)
    {
        DirectoryInfo dinfo = new DirectoryInfo(Folder);
        FileInfo[] Files = dinfo.GetFiles(FileType);
        foreach (FileInfo file in Files)
        {
            lsb.Items.Add(file.Name);
        }
    }

所以我现在有我的 2 个列表框,可以看到我有 game1.zip 和 game1.jpg,现在我可以用 game1 图像填充我的列表视图并启动他说的简单的模拟器。

这就是我当前填充列表视图的方式。

 PopulateListView();
 private void PopulateListView()
 {
  if (listBox1.Items.Contains("game1.zip"))
 {
   if (File.Exists("\\Images\\game1.jpg"))
    {
     imageList1.Images.Add(Image.FromFile("\\Images\\game1.jpg"));
     listView1.Items.Add("", 0);
    }
 }

 if (listBox1.Items.Contains("game2.zip"))
 {
   if (File.Exists("\\Images\\game2.jpg"))
    {
     imageList1.Images.Add(Image.FromFile("\\Images\\game2.jpg"));
     listView1.Items.Add("", 1);
    }
 }
}

这就是我目前正在启动的方式,并且工作正常。

 // launch item
 private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
 {
   if (listView1.Items[0].Selected == true)
    {
      string rom = "\\" + listBox1.Items[0].ToString();
      // Launch code in here
    }

    if (listView1.Items[1].Selected == true)
     {
       string rom = "\\" + listBox1.Items[1].ToString();
       // Launch code in here
     }
    }

那么你可能会问什么问题?如果可能的话,我不想继续为每个项目输入所有信息,我想使用某种陈述,我不知道要搜索什么没有帮助。图像名称将始终与 zip 名称匹配,只需要松开文件扩展名,以便像这样填充列表视图。

if (listbox1 item = listbox2 item)
 {
  add to imagelist and listview automaticly with same index
 } 

然后我希望能够使用这样的东西启动。

 private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
 {
      string rom = "\\" + listview.selected.item.tostring;
      // Launch code in here
 }

希望我在我的智慧尽头时说得通。

问候

德里克

4

3 回答 3

3

如果我理解正确,您想以编程方式阅读、匹配和显示所有相同的图像和 zip,并且当用户单击列表视图行以启动 rom 时。这可以按如下方式完成:

  • 读取所有图像 - 无需检查文件是否存在,因为如果不存在,则 GetFiles 将找不到它!
  • 阅读所有 rom - 同上!
  • 取所有同时具有图像和 zip 文件的名称(相同)
  • 同时填充图像列表和列表视图
  • 使用正确的图像绑定列表视图项
  • 存储ROM位置
  • 处理鼠标单击行并获取 rom 位置
  • 用 rom 文件做某事

编码:

    public ListForm()
    {
        InitializeComponent();

        // path to images and roms
        const string location = @"d:\temp\roms\";
        // bind image list with list view
        listViewControl.SmallImageList = imageList;
        // get all images without extension
        var images = System.IO.Directory.GetFiles(location, "*.gif").Select(f => System.IO.Path.GetFileNameWithoutExtension(f)).ToList();
        // get all roms without extension
        var zips = System.IO.Directory.GetFiles(location, "*.zip").Select(f => System.IO.Path.GetFileNameWithoutExtension(f)).ToList();
        // find all entries (images and zips) that have the same name
        var matching = images.Intersect(zips);
        var imageIndex = 0;
        // fill image list and list view at the same time and store rom location
        foreach (var match in matching)
        {
            // path to file without extension
            var file = System.IO.Path.Combine(location, match);
            // add image to image list
            imageList.Images.Add(match, Bitmap.FromFile(string.Format("{0}.gif", file)));
            // create list view item 
            var lvi = new ListViewItem(match);
            // and set list view item image
            lvi.ImageIndex = imageIndex;
            // store rom location
            lvi.Tag = string.Format("{0}.zip", file);
            imageIndex++;
            // and show
            listViewControl.Items.Add(lvi);
        }
    }

    private void listViewControl_MouseClick(object sender, MouseEventArgs e)
    {
        // when user clicks an item, fetch the rom location and go
        var item = listViewControl.GetItemAt(e.X, e.Y);
        if (item != null)
        {
            var pathToRom = item.Tag as string;
            // do something with rom ...
        }
    }

无需单独处理图像列表和列表视图。输出如下所示:

在此处输入图像描述

于 2013-09-08T11:57:31.627 回答
0

如果我正确理解了您的问题,您可以if使用以下命令切换您的语句塔:

var item = listView1.SelectedItem
string rom = "\\" + item.ToString()
// Launch code in here

要填充它,您可以更改它:

if (listBox1.Items.Contains("game2.zip"))
{
    if (File.Exists("\\Images\\game2.jpg"))
    {
        imageList1.Images.Add(Image.FromFile("\\Images\\game2.jpg"));
        listView1.Items.Add("", 1);
    }
}

对此:

List<string> files = new List<string> { "game1.zip", "game2.zip" };

var index = 0;
foreach (var file in files)
{
    if (File.Exists("\\Images\\" + file))
    {
        imageList1.Images.Add(Image.FromFile("\\Images\\" + file.Replace(".zip", ".jpg")));
        listView1.Items.Add("", index);
        index++;
    }
}
于 2013-09-08T11:30:16.793 回答
0

您可以使用 listView 中的名称填充图像:

  private void PopulateListView()
  {
     foreach (string curr in listBox1.Items)
     {
        string changed = "\\Images\\" + curr.Replace(".zip", ".jpg");

        if (File.Exists(changed))
        {
           imageList1.Images.Add(Image.FromFile(changed));
           listView1.Items.Add("", 1);
        }
     }
  }

并在MouseDoubleClick事件中使用所选项目

  // launch item
  private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
  {
     string selected = (string) listBox1.SelectedItem;
     string rom = "\\" + selected;
     // Launch code in here
  }
于 2013-09-08T11:33:50.283 回答