2010-11-06 54 views
6

嘿。 我有一個用戶可以搜索的項目列表。搜索結果顯示在列表框中。每個「animal」對象都有一個指向「隔離存儲」中圖像的路徑。將listboxitem中的Image控件綁定到獨立存儲中的圖像的最快捷方式是什麼?我見過的例子傾向於從互聯網上顯示圖像,而不是孤立存儲。如果我有大約10張圖像,它似乎佔用了所有的內存和崩潰。感謝孤立存儲中的綁定圖像

編輯:

我在我的BitmapConverter類使用這個(繼承的IValueConverter)

 public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
     { 
      if (value !=null) 
      { 
       BitmapImage bitmapImage = new BitmapImage(); 
       bitmapImage.SetSource(new MemoryStream((Byte[]) value)); 
       return bitmapImage; 
      } 
      else 
      { 
       return null; 
      } 
     } 

我有這個在我AppResource.xaml文件的頂部:

<ImageApp_Converter:BitmapConverter x:Key="bmpConverter" />  

In my style, within the AppResource.xaml file: 

<Image HorizontalAlignment="Left" Margin="8,8,0,4" Width="160" Height="120" Source="{Binding Converter={StaticResource bmpConverter}}" /> 

我在我的BitmapConverter中設置了一個斷點,但它從來沒有被調用過。我從來沒有使用過IValueConverter,所以任何幫助都會很棒。謝謝

+0

您是否忘記了綁定中的路徑?如果綁定到DataContext(而不是綁定到它的路徑),則應該通過{Binding。,Converter = {...}}或{Binding Path =。,Converter = {...}}來提及 – 2010-11-08 14:29:03

回答

6

顯示的代碼中存在一些問題。有些可能只是從您的示例中丟失:

首先,您綁定到轉換器沒有指定什麼要綁定到它的值,所以它永遠不會被調用。至少它需要一個Path =(或簡單的屬性名稱作爲捷徑)或者轉換器不會被調用。你在哪裏設置你的清單的ItemSource?

其次,傳遞的值是字符串文件名。您的轉換器需要使用它們作爲文件名並根據該名稱打開一個流。目前它正在嘗試使用名稱作爲字節數組。

最後,如果圖像是一個固定的集合,將它們存儲在ClientBin下的images文件夾中,並用下面的路徑語法「/images/imagename.jpg」簡單地引用它們會更有意義。自動涉及瀏覽器的緩存。你不需要一個轉換器。 (關鍵是領先的「/」。如果沒有Silverlight中假定圖像是代替當前模塊中)

alt text

下面是使用在看起來像的ClientBin /圖像文件夾中所示的圖像的完整示例這個運行時:

alt text

樣品XAML文件:

<UserControl x:Class="SilverlightApplication1.IsoImages" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ImageApp_Converter="clr-namespace:SilverlightApplication1" mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="400"> 
    <Grid x:Name="LayoutRoot" Background="White"> 
     <ListBox x:Name="ImageList"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Background="AliceBlue"> 
         <Image HorizontalAlignment="Left" Margin="8,8,0,4" Width="160" Height="120" Source="{Binding Path=Filename}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</UserControl> 

在S後面的充足代碼是:

using System.Collections.Generic; 
using System.Windows.Controls; 

namespace SilverlightApplication1 
{ 
    public partial class IsoImages : UserControl 
    { 
     public IsoImages() 
     { 
      InitializeComponent(); 
      List<ImageItem> images = new List<ImageItem>() 
             { 
              new ImageItem("/images/Image1.jpg"), 
              new ImageItem("/images/Image2.jpg"), 
              new ImageItem("/images/Image3.jpg"), 
              new ImageItem("/images/Image4.jpg") 
             }; 
      this.ImageList.ItemsSource = images; 
     } 
    } 

    public class ImageItem 
    { 
     public string Filename{ get; set; } 
     public ImageItem(string filename) 
     { 
      Filename = filename; 
     } 
    } 
} 
+0

哇,很好的回答。謝謝! – XSL 2010-11-08 16:40:14

0

由於您反覆將同一文件加載到新的BitmapSource對象中,因此可能是內存不足。您應該爲每個文件創建一個「約10」BitmapSource個對象。然後通過將它們分配給Image.Source屬性來重新使用這些BitmapSource實例。

要做到這一點的一種方法是使用IValueConverter的實現,該實現維護到BitmapSource鍵值對的文件路徑的靜態字典。

+0

感謝幫助。我無法讓IValueConverter工作,但我已經用我的代碼更新了這個問題。 – XSL 2010-11-06 20:12:29