使用代码将图像对象添加到wpf

我是C#和WPF的新手,我正在尝试创建一个简单的汽车模拟器。 主要是模拟器的想法是我有C#-class创建汽车对象,例如可以改变的速度变量和从左到右移动的计时器。 我想用计时器做动作而不是doubleanimation 。 在WPF中,我有AddCarButton用于在Canvas中的某些点添加汽车。

问题是我不知道如何将汽车添加到Canvas。 这是非常令人沮丧的,因为它听起来不是一件大事,但我觉得我已经尝试过所有事情而没有成功。

这是汽车级的最新尝试。 我尝试过使用Canvas.Set-methods但失败了。

 class car { private int speed; public car(int s) { speed = s; Bitmap bmp = new Bitmap( System.Reflection.Assembly.GetEntryAssembly(). GetManifestResourceStream("MyProject.Resources.car.png")); Graphics g = Graphics.FromImage(bmp); //Canvas.SetBottom(g, 0); //Canvas.SetLeft(g, 0); //Canvas.SetBottom(bmp, 0); //Canvas.SetLeft(bmp, 0); } public void addCar(car c) { Canvas.SetBottom(c, 0); Canvas.SetLeft(c, 0); } 

如果您在WPF上编码,则不应使用Windows窗体 。 要使用图像,可以使用BitmapSource及其派生类,并以编程方式访问资源,通常使用pack URI 。 不过,这不是唯一的方法。

这是一个在canvas控件上绘制一些图像的小例子。

canvas的XAML代码可能是这样的(这只是一个例子):

  

和你的主窗口代码……

 public partial class MainWindow : Window { BitmapImage carBitmap = new BitmapImage(new Uri("pack://application:,,,/Images/BlueCar.png", UriKind.Absolute)); Image[] carImg = new Image[5]; Random rnd = new Random(); public MainWindow() { InitializeComponent(); double maxX = canvas1.Width - carBitmap.Width; double maxY = canvas1.Height - carBitmap.Height; for (int i = 0; i < carImg.Length; i++) { carImg[i] = new Image(); carImg[i].Source = carBitmap; carImg[i].Width = carBitmap.Width; carImg[i].Height = carBitmap.Height; Canvas.SetLeft(carImg[i], rnd.NextDouble() * maxX); Canvas.SetTop(carImg[i], rnd.NextDouble() * maxY); canvas1.Children.Add(carImg[i]); } } } 

显然,您需要更改图像资源的名称。 顺便说一下,要添加图像,请转到Project > Add existing item ...并选择图像文件,现在您的图像将出现在Solution explorer中 (默认情况下,Visual Studio将图像资源存储在名为“Images”的文件夹中) ,如果你选择它,你会在Properties窗口中看到它的Build动作Resource不要改变它! (有些人认为它应该是嵌入式资源,但这是不正确的)。

如果你没有得到这个new Uri("pack://application:,,,/Images/BlueCar.png", UriKind.Absolute) ,你应该阅读包URI上的这个链接 。

您需要将位图放在Image (而不是Graphics )中,然后需要将图像添加到canvas:

 Canvas.Children.Add(image);