2013-05-02 44 views
1

我想在C#中創建WPF中的WhackaMole遊戲。我有點小菜。在for循環中,我試圖將「我」的數量添加到「圖像」。我收到以下錯誤:動態創建圖像 - 不存在當前上下文

"Error The name 'Image1' does not exist in the current context" 

'Image2'也是一樣。我正在嘗試將圖像集成到StackPanel中。

感謝您的幫助:)

public partial class MainWindow : Window 
    { 
     Image[] ImageArray = new Image[50]; 
     public MainWindow() 
     { 
      Moleini = MoleScore[1]; 
      InitializeComponent(); 
      //string ImageName = "Image"; 
      for (int i = 0; i <= 8; i++) 
      { 
       Image Image = new Image(); 
       ImageArray[i] = Image; 
       Image.Name = "Image" + i.ToString(); 
      } 

      ////Create Images 
      //for (int i = 0; i <= 8; i++) 
      //{ 
      // StackPanel1.Children.Add(CreateImage(i)); 
      //} 

      //Dispacher for Mole to Appear 
      System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer(); 
      dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); 
      dispatcherTimer.Interval = TimeSpan.FromSeconds(1); 
      dispatcherTimer.Start(); 

      //Dispacher for Full Game Time 
      System.Windows.Threading.DispatcherTimer endGame = new System.Windows.Threading.DispatcherTimer(); 
      endGame.Tick += new EventHandler(endGame_Tick); 
      endGame.Interval = TimeSpan.FromSeconds(5); 
      endGame.Start(); 
     } 

     ////Create Image 
     //public Image CreateImage(int i) 
     //{ 

     //} 

     private void dispatcherTimer_Tick(object sender, EventArgs e) 
     { 

      //Random Number Generator 
      Random rnd = new Random(); 
      int num = rnd.Next(1, 9); 

      //If Random Number is "1" Then Image will display 
      if (num == 1) 
      { 
       ImageSource MoleImage = new BitmapImage(new Uri(ImgNameMole)); 
       Image1.Source = MoleImage;    
      } 
      //If Random Number does not equal 1 
      if (num != 1) 
      { 
       ImageSource hole = new BitmapImage(new Uri(ImgHole)); 
       Image1.Source = hole; 
      } 

      //If Random Number is "2" Then Image will display 
      if (num == 2) 
      { 
       ImageSource MoleImage = new BitmapImage(new Uri(ImgNameMole)); 
       Image2.Source = MoleImage; 
      } 
} 
+0

if(num == 2)永遠不會碰到原因ü在num!= 1之前檢查,這將是true或num == 1 – WhileTrueSleep 2013-05-02 18:08:57

+0

我還有幾個if(num == x)語句,這就是說使用生成的隨機數顯示其他圖像。 – Andrew 2013-05-02 18:11:24

+0

你的語義錯了..你需要像if(num == 1){...} else if(num == 2){...}等那樣去做。 – WhileTrueSleep 2013-05-02 18:12:40

回答

1

使用此更新的代碼:

  private void dispatcherTimer_Tick(object sender, EventArgs e) 
      { 
       //Random Number Generator 
       Random rnd = new Random(); 
       int num = rnd.Next(1, 9); 

       //If Random Number is "1" Then Image will display 
       if (num == 1) 
       { 
        ImageSource MoleImage = new BitmapImage(new Uri(ImgNameMole)); 
        ImageArray[1].Source = MoleImage;    
       } 
       //If Random Number does not equal 1 
       if (num != 1) 
       { 
        ImageSource hole = new BitmapImage(new Uri(ImgHole)); 
        ImageArray[1].Source = hole; 
       } 

       //If Random Number is "2" Then Image will display 
       if (num == 2) 
       { 
        ImageSource MoleImage = new BitmapImage(new Uri(ImgNameMole)); 
        ImageArray[2].Source = MoleImage; 
       } 
    } 
+0

謝謝!最後得到這個工作!:D – Andrew 2013-05-02 18:46:18

0

Image Image = new Image();可能會導致問題。你應該考慮使用Image image = new Image();,沒有大寫我的變量名

+1

這絕對沒有危害我們在C#中聲明變量的方式,編譯器可以正確區分它,但從編碼準則來看,這不是最佳做法。 – 2013-05-02 18:30:21

+1

我仍然收到相同的錯誤:( – Andrew 2013-05-02 18:31:18

2

除非你省略了代碼,Image1Image2先前沒有宣佈。在dispatcherTimer_Tick範圍內使用這些變量將導致編譯時錯誤。

我想你打算引用ImageArray來代替。

// instead of this 
Image1.Source = MoleImage; 
// you want this 
ImageArray[1].Source = MoleImage; 
4

您是否考慮過爲您的遊戲使用MVVM設計模式?它更適合WPF的技術,因爲它保持了數據和UI層的分離,就像WPF的XAML和綁定系統一樣,它會使這更容易。

我記得answering關於掃雷遊戲的類似問題,所以我會從那裏開始。

從創建Mole對象開始。鼴鼠有3個屬性:RowIndex,ColumnIndexIsUp財產。

現在您需要一個模板來繪製Mole對象。爲local:Mole對象創建一個DataTemplate,並使用您的圖像繪製它。如果IsUp=True可以使用DataTrigger來繪製痣圖片,或者如果IsUp=False可以使用孔圖像。

現在在您的代碼隱藏中,創建一個Mole對象的列表,並初始化它們的默認值。這只是意味着創建Mole對象並設置其行/列索引的兩個循環。

要繪製列表,請在XAML中使用ItemsControl。將ItemsControl.ItemsPanelTemplate更改爲Grid,並將ItemsControl.ItemContainerStyleGrid.RowGrid.Column屬性綁定到Mole對象上的RowIndexColumnIndex屬性。

末後,啓動一個定時器隨機變化在列表中IsUp=false隨機Mole對象的IsUp屬性true。將其更改爲true時,還會啓動第二個定時器,該定時器在隨機時間後會更改IsUp=false

添加分數應該相當容易。在Mole對象中添加ICommand HitMoleCommand對象,該對象返回RelayCommand,該對象在IsUp=True時啓用,並在那裏執行某些邏輯(計算點,更改IsUp=False和取消定時器等)。

但無論如何,Image1不是MainWindow類的屬性,這就是爲什麼您無法從調度程序代碼訪問它的原因。只需創建一個對象並給它起個名字就不會將其存儲爲Window上的屬性,就像創建對象並在運行該項目之前在XAML中爲其指定名稱一樣。您需要將該圖像存儲在課程的某個位置以便像這樣訪問它,例如在ImageArray對象中。

我發現在我寫這篇文章的時候你已經找到了答案,但我仍然發佈它,因爲我強烈地感覺到,如果你使用WPF,你真的應該在最少理解MVVM的設計模式,即使你不選擇使用它:)

+0

哇,謝謝,我一定會嘗試這個 :) – Andrew 2013-05-02 19:00:50

相關問題