4

我是 C# 和 WPF 的新手,我正在尝试创建一个简单的汽车模拟器。模拟器的主要想法是我有 C# 类来创建汽车对象,例如可以更改的速度变量和从左到右移动的计时器。我想用计时器而不是例如做运动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);
    }
4

2 回答 2

3

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

这是一个在画布控件上绘制一些图像的小示例。

画布的 XAML 代码可能是这样的(这只是一个示例):

<Canvas Height="400" HorizontalAlignment="Left" Margin="0" Name="canvas1" VerticalAlignment="Top" Width="400" />

和你的主窗口代码......

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...并选择您的图像文件,现在您的图像将出现在解决方案资源管理器中(默认情况下,Visual Studio 将图像资源存储在一个名为“Images”的文件夹中) ,如果您选择它,您将在Properties窗口中看到它的Build 操作Resource不要更改它!(有些人认为它应该是嵌入式资源,但这是不正确的)。

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

于 2013-01-15T22:24:44.523 回答
1

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

Canvas.Children.Add(image);
于 2013-01-15T11:31:07.173 回答