none
Rectangle 和 Image中的图片消失 RRS feed

  • 问题

  • 在做一个silverlight 项目中:

    一个Canvas里有多个Rectangle ,在 Rectangle 里 Fill 一个 ImageBrush,(多个矩形共用一个ImageBrush),后,多次设置 Rectangle 的"Canvas.LeftProperty"和"Canvas.TopProperty"属性后,原本的图片ImageBrush 变成了实色(图片为单色图案,png格式,带透明),颜色为图片的颜色.不知道为何,再多次设置"Canvas.LeftProperty"和"Canvas.TopProperty"属性后又可以正常显示. 这是变成实色的情况 ,也遇到有图片消失,但Rectangle 还在(鼠标事件存在)的情况. 另外在Image控件里Fill的图片也遇到了消失的情况.图片消失后能看到有一个像素高的线,长度为image控件或是矩形的宽度.  请教如何解决这种情况.

    注:Rectangle 和 image 的位置会随着比例尺的缩放而在canvas中变化,其位置的值在相同的比例尺下是确定的.

    开发工具:vs2010, sl 4

    2011年1月12日 15:27

答案

  • BitmapSource共享问题是出在Silverlight2时代,我不能确定是否Silverlight4也有类似问题。

    Image主要是内存占用问题,BitmapImage是以Bitmap的形式存放图像数据,因此若读取一张1024×1024的图片,即使把它显示在UI上只有10×10大,但它内存占用量仍为4MB。而若读取的源图为10×10,则实际内存占用量为400Byte,即使你创建1000个bitmapimage,内存占用量仍为400KB。

    我看你的图片显示大小应该不大吧,只要你选择大小合适的图像源,为每个图像创建单独Source应该不会造成性能问题。


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    • 已标记为答案 大紫杉 2011年1月18日 1:11
    2011年1月13日 9:56

全部回复

  • 还遇到更精彩的是,屏幕上一半是正常的一半是实色的.如以下连接地址图片
    http://yew4.org/_otherfiles/3.jpg

    2011年1月12日 15:33
  • 问题可能出在BitmapImage共享上,为每个Rectangle创建单独的ImageBrush以及BitmapImage应该能解决问题。


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年1月13日 7:39
  • 如图片里,一屏可能有上千个Rectangle (总UI可能达几千),如果每个都使用一个图片,使用image控件测试,效率非常低.(Rectangle是不是与image控件系统开销相当?)

    上文提到的那个图片里是使用 ImageBrush 来 Fill 的 Rectangle 的,不是BitmapImage,会有共享问题? 如果是如何解决效率问题?

    2011年1月13日 8:28
  • BitmapSource共享问题是出在Silverlight2时代,我不能确定是否Silverlight4也有类似问题。

    Image主要是内存占用问题,BitmapImage是以Bitmap的形式存放图像数据,因此若读取一张1024×1024的图片,即使把它显示在UI上只有10×10大,但它内存占用量仍为4MB。而若读取的源图为10×10,则实际内存占用量为400Byte,即使你创建1000个bitmapimage,内存占用量仍为400KB。

    我看你的图片显示大小应该不大吧,只要你选择大小合适的图像源,为每个图像创建单独Source应该不会造成性能问题。


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    • 已标记为答案 大紫杉 2011年1月18日 1:11
    2011年1月13日 9:56
  • 我使用 image 控件试过,为每一个image 从资源读取一个bitmapimage为图片源,但效率很低就是在生成UI的时候很耗时,图片的大小为64*64.
    象这样的需求使用什么控件显示很多相同的的图片更合适?
    2011年1月13日 10:52
  • 为每个Image创建单独的BitmapImage是否能解决你最初的问题?图像形式简单的话,可考虑使用Path来制作图标。


    Mog Liang
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年1月14日 2:59
  • 为每个Image创建单独的BitmapImage 使用 Image 控件来显示,还是会出现色块,但出现的机率比使用Rectangle的Fill方法小多了,偶尔出现色块,在下次重设位置的时候就刷新回正确的图片。显示的图片的增多,内存占用是比原来要大一些,可以接受,呵呵,,谢谢啦~

    另外使用Path频繁的画大量图标,不知道性能怎么样,有没有这方面的经验?

    2011年1月17日 2:21