动态创建图像-不存在于当前上下文中
本文关键字:于当前 上下文 不存在 创建 图像 动态 | 更新日期: 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
对象开始。摩尔具有三种性质:RowIndex
、ColumnIndex
和IsUp
。
现在您需要一个模板来绘制Mole
对象。为local:Mole
对象创建一个DataTemplate
,并使用您的图像绘制它。如果IsUp=True
,则可以使用DataTrigger
来绘制摩尔图像,如果IsUp=False
,则可以用于绘制空穴图像。
现在,在您的代码隐藏中,创建一个Mole
对象列表,并初始化它们的默认值。这只意味着要进行两个循环,分别创建Mole
对象和设置它们的行/列索引。
若要绘制列表,请在XAML中使用ItemsControl
。将ItemsControl.ItemsPanelTemplate
更改为Grid
,并将ItemsControl.ItemContainerStyle
的Grid.Row
和Grid.Column
属性绑定到Mole
对象上的RowIndex
和ColumnIndex
属性。
最后,启动一个定时器,将列表中随机Mole
对象的IsUp
属性随机更改为IsUp=false
到true
。当将其更改为true时,还启动第二个计时器,该计时器将在随机时间后更改IsUp=false
。
增加分数应该相当容易。向Mole
对象添加一个ICommand HitMoleCommand
,该对象返回一个在IsUp=True
时启用的RelayCommand
,并在那里执行一些逻辑(计算点、更改IsUp=False
和取消计时器等(。
但无论如何,Image1
不是MainWindow
类的属性,这就是为什么您不能从调度程序代码访问它的原因。仅仅创建一个对象并为其命名并不会将其存储为Window上的属性,就像在运行项目之前创建一个物体并在XAML中为其命名一样。您需要将图像存储在类上的某个位置,以便像这样访问它,例如ImageArray
对象中。
我看到你在我写这篇文章的时间里已经找到了答案,但我无论如何都会发布它,因为我强烈认为,如果你在使用WPF,你至少应该了解MVVM设计模式,即使你不选择使用它:(
除非您省略了代码,否则Image1
和Image2
以前没有声明过。在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