1

我正在尝试在 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;
            }
}
4

4 回答 4

4

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

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

从创建Mole对象开始。鼹鼠有 3 个属性:RowIndexColumnIndexIsUp属性。

现在您需要一个模板来绘制您的Mole对象。DataTemplate为对象创建一个local:Mole,并使用您的图像绘制它。ADataTrigger可用于绘制痣图 ifIsUp=True或孔图 if IsUp=False

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

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

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

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

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

我看到你在我写这篇文章的时间里找到了你的答案,但我还是把它发布了,因为我强烈认为如果你正在使用 WPF,你真的至少应该了解 MVVM设计模式,即使您不选择使用它:)

于 2013-05-02T18:55:02.340 回答
2

除非您省略了代码,Image1并且Image2之前没有声明过。在范围的上下文中使用这些变量dispatcherTimer_Tick将导致编译时错误。

我认为您打算改为引用ImageArray

// instead of this
Image1.Source = MoleImage;
// you want this
ImageArray[1].Source = MoleImage;
于 2013-05-02T18:39:06.953 回答
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;
                }
    }
于 2013-05-02T18:38:54.970 回答
0

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

于 2013-05-02T18:24:58.123 回答