我正在尝试用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;
}
}
答案 0 :(得分:4)
您是否考虑过为您的游戏使用MVVM设计模式?它更适合WPF的技术,因为它保持数据和UI层分离,就像WPF的XAML和Binding系统那样,它会使这更容易。
我记得answering关于扫雷游戏的类似问题,所以我会从那里开始。
首先创建Mole
个对象。 Moles有3个属性:RowIndex
,ColumnIndex
和IsUp
属性。
现在您需要一个模板来绘制Mole
个对象。为DataTemplate
对象创建local:Mole
,并使用您的图片绘制它。如果DataTrigger
可以使用IsUp=True
来绘制痣图片,或者IsUp=False
可以使用孔图像。
现在在您的代码隐藏中,创建一个Mole
个对象列表,并初始化它们的默认值。这只是意味着创建Mole
个对象并设置其行/列索引的两个循环。
要绘制列表,请在XAML中使用ItemsControl
。将ItemsControl.ItemsPanelTemplate
更改为Grid
,并将Grid.Row
的{{1}}和Grid.Column
属性绑定到ItemsControl.ItemContainerStyle
和RowIndex
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)
除非您省略了代码,否则先前未声明Image1
和Image2
。在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();
,而不使用变量名称上的大写字母