在Silverlight中在Canvas上动态绘制图像

时间:2012-02-15 23:36:37

标签: c# .net silverlight image dynamic

我正试图在Silverlight中组建一个小型游戏引擎。

然而,我目前陷入了一个相当低级别的问题:能够在不同的位置绘制图像。我打算通过代码动态地执行此操作,因为从我看到的情况来看,XAML中的大多数内容往往都是静态的。

我已将基础'网格'更改为Canvas,相反,我可以在其上任意位置绘制。也许这不是一个坏主意,但我不知道。任何或所有建议都会有所帮助。

        InitializeComponent();
        Image img = new Image();
        img.Source = new BitmapImage(new Uri("Generic URL here"));
        ((BitmapImage)(img.Source)).DownloadProgress += new System.EventHandler<DownloadProgressEventArgs>(TestEventHandler);

        Rect position = new Rect(new Point(25, 25), img.RenderSize);

        LayoutRoot.Children.Add(img);
        img.Arrange(position);

我上面的原始尝试是使用上面的“排列”功能将图像“移动”到新位置。但是,我不知道它是如何工作的,当我做上面的代码时,图像不再显示在屏幕上。

一个不相关的问题:是否可以使用Silverlight应用程序存储图像,以便不通过URL加载它们?我知道这可能是,但我真正想要问的是,我会怎么做呢?

谢谢大家的帮助。

-Stefan Zuefeldt

4 个答案:

答案 0 :(得分:1)

应设置图像的依赖属性以在画布上定位图像。

Canvas.SetTopCanvas.SetLeft

第二名。当然,您的图像可以存储在Silverlight应用程序中。但是他们的构建操作应该设置为Embeded Resource。

img.Source = new BitmapImage(new Uri("/MyNameSpace;components/images/someimage.png", UriKind.Relative));

答案 1 :(得分:1)

XAML不一定是静态的。如果您将XAML与数据模型结合使用并使用数据绑定,那么XAML可以使用它。

您可以在画布上移动项目,您想要的是依赖项属性Canvas.TopCanvas.Left

here是一个关于简单动画的小教程,就像你描述的那样。如果你谷歌的“银光游戏教程”,你会发现大量的博客,文章和演示与源代码。

至于你其他无关的问题......你可以用你的应用程序嵌入图像。 here是访问文件和图像的大多数方法的良好来源

答案 2 :(得分:1)

我一直在使用基本用户界面的SL应用程序。根据我的小经验,我可以给你一些提示。

  

我已将基础'网格'更改为Canvas,相反,我可以   画在任何地方。不过,也许这是一个坏主意,......

我认为这是显而易见的选择。至于在画布上定位东西,从这个引用SL Layout - Absolute Layout

  

要基于绝对定位创建布局,必须替换   网格与画布。 ...要在Canvas上定位控件,请在控件上设置以下附加属性:Canvas.Left&amp; Canvas.Top


  

..是否可以使用Silverlight应用程序存储图像,如   没有通过URL加载它们?我知道这可能是,但是我   真的是要问,我会怎么做呢?

您可以随时将图像和形状保存在字典或smth中(因此在内存中),因此resizing the images(例如,当您下载完成时)可以避免过多的内存消耗。

这些是我想到的一些事情。祝你好运。

答案 3 :(得分:1)

  • 使用Canvas代替Grid是一个好主意。如果您想要更改其子控件的位置

  • ,Canvas优于Grid
  • 要将图像移动到点p,您可以通过以下方式执行此操作:

    • 将图像添加到画布
    • 调用Canvas.SetLeft(img,p.X)和Canvas.SetTop(img,p.Y)


  • 如果要将图像添加到xap,可以轻松地将图像添加到项目中,并将图像的构建类型设置为“内容”(默认为无或资源,我不确定),然后使用相对url:img.Source = new BitmapImage(new Uri(“/ tmp.jpg”,UriKind.Relative));