2017-02-07 4 views
-2

ランダムピクチャをWPF <Image>に設定するにはどうすればよいですか?C# - WPF - ランダムピクチャを<Image>に設定する

私のコードには4枚の画像があります。このような画像のソースを設定しますimg1_Loaded_1

機能:

問題は、私は同じ絵を持っている2枚の画像を好きだろうということです。たとえば、img1とimg4は同じ画像を持ち、image2は異なる画像を持ち、img3も異なる画像を持っています。この瞬間、私はこのようにしましたが、この画像をimg1、img2などに動的に設定したいと思います。私はこの4つの画像のうち2つが同じ画像を持つようにランダム化したいと思います。

どのように私はこれを達成することができますか?

+0

なぜ生命を困難にし、異なる画像を持つ2つの画像が同じ画像を持つのですか? –

+0

はい、私は同じ画像で2つの画像の名前を同じように設定できますが、例えば 'img1'は常に' bitImages [0] 'を持ち、最後の3つの画像(' img2'、 'img3 '、' img4')は 'img1'と同じ画像を持っています – KinectUser

+0

しかし、なぜ同じ画像を複数回保存していますか?なぜ元のものを参照して頭痛を救うのはなぜですか?それは1を取って数回だけ印刷するのではなく、同じ木を5回撮るのと同じです。 –

答えて

0

この基本コードをすばやくまとめて、うまくいけば正しい軌道に乗ります。コードは一度呼び出すだけでよいので、Window_Loadedや他の同様の高レベルのコンテナに置く必要があります。潜在的には、LINQを使用してリストをフィルタリングするなどの他の処理を行うことができます(たとえば、画像コントロールを選択するとソースが無効になります)。ご質問がある場合はお知らせください。

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     //Set up lists to track which images/image controls have been used .. image resources and image controls will be removed from the relevant list once used. 
     int imageCount = 4; 
     IList<string> imageNames = new List<string>(imageCount) { "Image0", "Image1", "Image2", "Image3" }; 
     IList<Image> imageControls = new List<Image>(imageCount) { img1, img2, img3, img4 }; 

     //Pick an image resource at random to use as the one that will appear twice. 
     Random random = new Random(); 
     int duplicatedImageIndex = random.Next(0, imageCount - 1); 
     Uri duplicatedImageUri = new Uri("/rnd_pic;component/Images/" + imageNames[duplicatedImageIndex] + ".jpg", UriKind.RelativeOrAbsolute); 

     //Select a random image control for first instance of image resource to be duplicated, then remove control from list to ensure it's not re-used. 
     int firstDuplicatedImageControlIndex = random.Next(0, imageCount - 1); 
     imageControls[firstDuplicatedImageControlIndex].Source = new BitmapImage(duplicatedImageUri); 
     imageControls.RemoveAt(firstDuplicatedImageControlIndex); 

     //Select a random image control for second instance of image resource to be duplicated, then remove control & image resource from relevant list to ensure they're not re-used. 
     int secondDuplicatedImageControlIndex = random.Next(0, --imageCount - 1); 
     imageControls[secondDuplicatedImageControlIndex].Source = new BitmapImage(duplicatedImageUri); 
     imageControls.RemoveAt(secondDuplicatedImageControlIndex); 
     imageNames.RemoveAt(duplicatedImageIndex); 

     //loop through remaining image controls setting one of the remaining random images, removing control & image resource from relevant list as you go. 
     while (imageControls.Any()) 
     { 
      int randomUpperBound = --imageCount - 1; 
      int nextRandomImageIndex = random.Next(0, randomUpperBound); 
      int imageControlIndex = random.Next(0, randomUpperBound); 
      Uri nextImageUri = new Uri("/rnd_pic;component/Images/" + imageNames[nextRandomImageIndex] + ".jpg", UriKind.RelativeOrAbsolute); 
      imageControls[imageControlIndex].Source = new BitmapImage(nextImageUri); 
      imageControls.RemoveAt(imageControlIndex); 
      imageNames.RemoveAt(nextRandomImageIndex); 
     } 
    } 
+0

ありがとう、それは動作するようだが、今私は問題がある。ボタンのクリックイベントでは、この 'img0.Source == img2.Source'のような画像ソースを比較しても同じですが、何も起こりません。 – KinectUser

+0

私のソリューションで画像ソースを設定すると、画像ソースの比較はボタンクリックイベントで機能します。あなたの解決ボタンをクリックイベントが動作しない – KinectUser

+0

比較とボタンクリックイベントで達成しようとしていることを教えてください。あなたのコードを貼り付けることができれば、さらに良い。 –

関連する問題