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

本文关键字:于当前 上下文 不存在 创建 图像 动态 | 更新日期: 2023-09-27 18:11:57

我正试图在C#中的WPF中创建一个WhackaMole游戏。我有点傻。在for循环中,我试图将数字"I"添加到"图像"中。我得到以下错误:

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

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

您是否考虑过在游戏中使用MVVM设计模式?它更适合WPF的技术,因为它将数据层和UI层分开,就像WPF的XAML和Binding系统一样,这会让这变得更容易。

我记得我回答过一个关于扫雷舰游戏的类似问题,所以我将从那里开始。

从创建Mole对象开始。摩尔具有三种性质:RowIndexColumnIndexIsUp

现在您需要一个模板来绘制Mole对象。为local:Mole对象创建一个DataTemplate,并使用您的图像绘制它。如果IsUp=True,则可以使用DataTrigger来绘制摩尔图像,如果IsUp=False,则可以用于绘制空穴图像。

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

若要绘制列表,请在XAML中使用ItemsControl。将ItemsControl.ItemsPanelTemplate更改为Grid,并将ItemsControl.ItemContainerStyleGrid.RowGrid.Column属性绑定到Mole对象上的RowIndexColumnIndex属性。

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

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

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

我看到你在我写这篇文章的时间里已经找到了答案,但我无论如何都会发布它,因为我强烈认为,如果你在使用WPF,你至少应该了解MVVM设计模式,即使你不选择使用它:(

除非您省略了代码,否则Image1Image2以前没有声明过。在dispatcherTimer_Tick作用域的上下文中使用这些变量将导致编译时错误。

我想你打算参考ImageArray

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

使用此更新的代码:

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

Image Image = new Image();可能会导致问题。您应该考虑使用Image image = new Image();,变量名上没有大写I