【问题标题】:Adding image objects to wpf with code使用代码将图像对象添加到 wpf
【发布时间】:2012-12-29 11:37:33
【问题描述】:

我是 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);
    }

【问题讨论】:

  • 您的图像在资源中,那么为什么不使用 Properties.Resources. 以常规方式访问它,而不是使用反射来提取它?
  • 在开始编码之前请至少阅读Imaging Overview

标签: c# wpf simulator


【解决方案1】:

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

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

画布的 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不要改变这个!(有些人认为它应该是 Embedded resource 但那是不正确)。

如果你没有得到这个new Uri("pack://application:,,,/Images/BlueCar.png", UriKind.Absolute),你应该阅读pack URIs上的this link

【讨论】:

  • 感谢您的回答,但我仍然无法将汽车添加到画布。对于命令“Canvas.SetLeft(car(...”),我收到错误“无法从 'Simulator.car' 转换为 'System.Windows.UIElement'”。如何让我的汽车类像 UIElement 一样或转换它到 UIElement 以便可以添加它?
【解决方案2】:

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

Canvas.Children.Add(image);

【讨论】:

猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多