2014-01-12 66 views
0

我正在WPF中創建一個簡單的「Pairs」遊戲。我在MainWindow上有12個圖像控件。我需要做的是使用OpenFileDialog來選擇多個圖像(可以少於全部6個),然後將它們隨機放置到Image控件中。每張照片應該出現兩次。我將如何能夠實現這一目標?我在這裏停留了一段時間,目前只有以下代碼。我不是在尋求解決方案,我只需要一些關於如何處理這個問題的提示。謝謝。隨機將圖像放在多個圖像控件中

> 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 *範圍內的隨機數。從* 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)); 

當然,你也可以做它在許多其他方面,一些更容易理解,一些更有效。只需選擇一種您感覺舒適的方法即可。