2014-01-12 3 views
0

Я создаю простую игру «Пар» в WPF. У меня есть 12 элементов управления изображением на MainWindow. Что мне нужно сделать, так это использовать 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; 
    } 
+0

Основная идея: Возьмите имена файлов из диалога и поместите их дважды (!) В список (назовем его * fileList *). Теперь запустите цикл, генерирующий изображения. В цикле сгенерируйте случайное число в диапазоне от 0 до * fileList.Count-1 *. Получите соответствующий элемент filename из * fileList *, чтобы создать изображение, а также удалите этот элемент из * fileList *. Цикл заканчивается, когда * fileList * становится пустым. – elgonzo

+0

Попробуем. Спасибо за совет. – cvenko

ответ

0

Существует множество способов достижения требуемых результатов. Хороший способ будет использовать Directory.GetFiles method, который возвращает коллекцию string путей файлов:

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

Вы можете использовать метод рандомизации порядок сбора. Из C# Shuffle Array страницы на DotNETPerls:

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)); 

Конечно, вы можете также сделать это многими другими способами, некоторые легче понять, некоторые более эффективны. Просто выберите метод, с которым вам удобно.

Смежные вопросы