动态创建图像 - 在当前上下文中不存在

时间:2013-05-02 18:07:02

标签: c# image

我正在尝试用C#在WPF中创建一个WhackaMole游戏。我有点像菜鸟。在for循环中,我试图将“i”的数量添加到“Image”中。我收到以下错误:

 "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;
            }
}

4 个答案:

答案 0 :(得分:4)

您是否考虑过为您的游戏使用MVVM设计模式?它更适合WPF的技术,因为它保持数据和UI层分离,就像WPF的XAML和Binding系统那样,它会使这更容易。

我记得answering关于扫雷游戏的类似问题,所以我会从那里开始。

首先创建Mole个对象。 Moles有3个属性:RowIndexColumnIndexIsUp属性。

现在您需要一个模板来绘制Mole个对象。为DataTemplate对象创建local:Mole,并使用您的图片绘制它。如果DataTrigger可以使用IsUp=True来绘制痣图片,或者IsUp=False可以使用孔图像。

现在在您的代码隐藏中,创建一个Mole个对象列表,并初始化它们的默认值。这只是意味着创建Mole个对象并设置其行/列索引的两个循环。

要绘制列表,请在XAML中使用ItemsControl。将ItemsControl.ItemsPanelTemplate更改为Grid,并将Grid.Row的{​​{1}}和Grid.Column属性绑定到ItemsControl.ItemContainerStyleRowIndex ColumnIndex对象上的属性。

最后,启动一个计时器,将Mole列表中随机IsUp对象的Mole属性随机更改为IsUp=false。将其更改为true时,也会启动第二个计时器,该计时器将在一段随机时间后更改true

添加分数应该相当容易。向IsUp=false对象添加ICommand HitMoleCommand,该对象返回Mole时启用的RelayCommand,并在那里执行一些逻辑(计算点数,更改IsUp=True和取消计时器等)。

但无论如何,IsUp=False不是您Image1类的属性,这就是您无法从调度程序代码访问它的原因。仅创建一个对象并为其命名并不会将其作为属性存储在Window上,就像在创建对象并在运行项目之前在XAML中为其命名一样。您需要将图像存储在类的某个位置以便像这样访问它,例如在MainWindow对象中。

我看到你在我写这篇文章的时候已经找到了你的答案,但是我还是发帖了,因为我强烈地觉得如果你和WPF一起工作,你至少应该这样做了解MVVM设计模式,即使您不选择使用它:)

答案 1 :(得分:2)

除非您省略了代码,否则先前未声明Image1Image2。在dispatcherTimer_Tick范围的上下文中使用这些变量将导致编译时错误。

我认为您打算改为引用ImageArray

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

答案 2 :(得分: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;
                }
    }

答案 3 :(得分:0)

Image Image = new Image();可能会导致问题。您应该考虑使用Image image = new Image();,而不使用变量名称上的大写字母