我正在尝试在 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 和绑定(bind)系统所做的那样,并且它会使这更容易。
我记得answering关于扫雷游戏的类似问题,所以我将从那里开始。
从创建 Mole
对象开始。 Moles 有 3 个属性:RowIndex
、ColumnIndex
和 IsUp
属性。
现在您需要一个模板来绘制您的 Mole
对象。为 local:Mole
对象创建一个 DataTemplate
,并使用您的图像绘制它。如果IsUp=True
,DataTrigger
可用于绘制痣图片,如果IsUp=False
,则可用于绘制孔图像。
现在在您的代码隐藏中,创建一个 Mole
对象列表,并初始化它们的默认值。这只是意味着两个循环,通过创建 Mole
对象,并设置它们的行/列索引。
要绘制列表,请使用 XAML 中的 ItemsControl
。将 ItemsControl.ItemsPanelTemplate
更改为 Grid
,并绑定(bind) Grid.Row
和 Grid.Column
属性ItemsControl.ItemContainerStyle
到 Mole
对象上的 RowIndex
和 ColumnIndex
属性。
最后,启动一个计时器,随机更改列表中随机 Mole
对象的 IsUp
属性为 IsUp=false
到 true
。将其更改为 true 时,还会启动第二个计时器,该计时器将在随机时间后更改 IsUp=false
。
添加分数应该相当容易。向 Mole
对象添加一个 ICommand HitMoleCommand
,它返回一个 RelayCommand
,当 IsUp=True
时启用,并且在那里做一些逻辑(计算点数、更改 IsUp=False
和取消计时器等)。
但无论如何,Image1
不是您的 MainWindow
类的属性,这就是您无法从调度程序代码访问它的原因。只是创建一个对象并为其命名并不会将其作为属性存储在 Window 上,就像在运行项目之前创建一个对象并在 XAML 中为其命名一样。您需要将图像存储在类中的某处才能像那样访问它,例如在 ImageArray
对象中。
我看到您在我写这篇文章时已经找到了您的答案,但我还是要发布它,因为我强烈认为如果您正在使用 WPF,您至少应该这样做了解 MVVM 设计模式,即使您不选择使用它 :)
关于c# - 动态创建图像 - 当前上下文中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344818/