随机将图像放在多个图像控件中

时间:2014-01-12 17:15:32

标签: c# wpf

我正在WPF中创建一个简单的“Pairs”游戏。我在MainWindow上有12个Image控件。我需要做的是使用OpenFileDialog选择多个图像(可以少于全部6个),然后随机将它们放入图像控件中。每张图片应该出现两次。我怎么能做到这一点?我被困在这里一段时间,目前只有以下代码。我不是要求解决方案,我只需要一些关于如何处理这个问题的指示。谢谢。

  > public ObservableCollection<Image> GetImages()
    {
        OpenFileDialog dlg = new OpenFileDialog();
        dlg.Multiselect = true;

        ObservableCollection<Image> imagesList = new ObservableCollection<Image>();

        if (dlg.ShowDialog() == true)
        {
            foreach (String img in dlg.FileNames)
            {
                Image image = new Image();

                image.Name = "";
                image.Location = img;
                imagesList.Add(image);
            }
        }
        return imagesList;
    }

1 个答案:

答案 0 :(得分:0)

有很多方法可以达到您所需的效果。一个好方法是使用Directory.GetFiles method,它将返回string个文件路径的集合:

string [] filePaths = Directory.GetFiles(targetDirectory);

然后,您可以使用方法随机化集合的顺序。从DotNETPerls上的C# Shuffle Array页面:

public string[] RandomizeStrings(string[] arr)
{
    List<KeyValuePair<int, string>> list = new List<KeyValuePair<int, string>>();
    // Add all strings from array
    // Add new random int each time
    foreach (string s in arr)
    {
        list.Add(new KeyValuePair<int, string>(_random.Next(), s));
    }
    // Sort the list by the random number
    var sorted = from item in list
             orderby item.Key
             select item;
    // Allocate new string array
    string[] result = new string[arr.Length];
    // Copy values to array
    int index = 0;
    foreach (KeyValuePair<int, string> pair in sorted)
    {
        result[index] = pair.Value;
        index++;
    }
    // Return copied array
    return result;
}

然后添加重复的文件路径,再次重新随机化订单并使用以下项填充您的UI属性:

string[] filePathsToUse = new string[filePaths.Length * 2];
filePaths = RandomizeStrings(filePaths);
for (int count = 0; count < yourRequiredNumber; count++)
{
    filePathsToUse.Add(filePaths(count));
    filePathsToUse.Add(filePaths(count));
}
// Finally, randomize the collection again:
ObservableCollection<string> filePathsToBindTo = new 
    ObservableCollection<string>(RandomizeStrings(filePathsToUse));

当然,您也可以通过许多其他方式来实现,一些更容易理解,一些更有效。只需选择一种您觉得舒服的方法。