2013-05-02 39 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

相关问题