2010-11-06 14 views
6

Oye. Tengo una lista de elementos que el usuario puede buscar. Los resultados de búsqueda se muestran en un cuadro de lista. Cada objeto animal tiene una ruta a una imagen en Almacenamiento aislado. ¿Cuál es la forma más rápida de vincular mi control de imagen dentro del elemento de cuadro de lista a la imagen en el almacenamiento aislado? Los ejemplos que he visto tienden a mostrar imágenes de Internet en lugar de almacenamiento aislado. Si tengo alrededor de 10 imágenes, parece ocupar toda la memoria y colgar. graciasImagen de encuadernación en almacenamiento aislado

EDIT:

estoy usando esto en mi clase BitmapConverter (hereda 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; 
      } 
     } 

tengo esta en la parte superior de mi archivo 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}}" /> 

Establecí un punto de interrupción en mi BitmapConverter, pero nunca se llama. Nunca antes había usado IValueConverter, por lo que cualquier ayuda sería genial. Gracias

+0

¿Olvidaste el camino en tu enlace?Si se vincula a su Datacontext (y no a una ruta desde él) debe mencionarlo por {Binding., Converter = {...}} o {Binding Path =., Converter = {...}} –

Respuesta

6

Hay algunos problemas en el código que se muestra. Algunos pueden faltar en su ejemplo:

En primer lugar, su vinculación al convertidor no especifica a qué se une para obtener su valor, por lo que nunca se invoca. Como mínimo, necesita un Path = (o simplemente un nombre de propiedad como atajo) o no se llamará al convertidor. ¿Dónde está configurando ItemSource de su lista?

En segundo lugar, los valores que se pasan son los nombres de los archivos de cadena. Su convertidor necesita usarlos como nombres de archivos y abrir una secuencia basada en ese nombre. Por el momento, está tratando de usar los nombres como matrices de bytes.

Finalmente, si las imágenes son un conjunto fijo, tendría más sentido almacenarlas en una carpeta de imágenes bajo ClientBin y simplemente hacer referencia a ellas con la siguiente sintaxis de ruta "/images/imagename.jpg" etc. Esto hará involucrar el almacenamiento en caché del navegador de forma automática. No necesitas un convertidor para eso. (La clave es el principal "/". Sin esa Silverlight asume las imágenes están en el módulo actual lugar)

alt text

A continuación se muestra un ejemplo completo utilizando las imágenes que se muestran en la/las imágenes carpeta ClientBin que se parece esto cuando ejecute:

alt text

Muestra archivo 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> 

Los s El amplio código detrás es:

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

Guau, excelente respuesta. ¡Gracias! – XSL

0

Probablemente se está quedando sin memoria porque está cargando repetidamente el mismo archivo en nuevos objetos BitmapSource. Debería crear solo "alrededor de 10" BitmapSource objetos uno para cada archivo. A continuación, vuelva a utilizar esas instancias BitmapSource asignándolas a propiedades Image.Source.

Una forma de hacerlo es utilizar una implementación de IValueConverter que mantiene un diccionario estático de la ruta del archivo a BitmapSource pares de valores clave.

+0

Gracias por la ayuda. No puedo lograr que IValueConverter funcione, pero actualicé la pregunta con mi código. – XSL

Cuestiones relacionadas