Обязательное изображение в изолированном хранилище - PullRequest
6 голосов
/ 06 ноября 2010

Эй.У меня есть список предметов, которые пользователь может искать.Результаты поиска отображаются в списке.Каждый animal объект имеет путь к изображению в изолированном хранилище.Какой самый быстрый способ привязать мой элемент управления изображением в элементе списка к изображению в изолированном хранилище?Примеры, которые я видел, имеют тенденцию отображать изображения из Интернета, а не в изолированном хранилище.Если у меня есть около 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.xamlfile:

    <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 раньше, поэтому любая помощь будет отличной.Спасибо

Ответы [ 2 ]

6 голосов
/ 08 ноября 2010

В показанном коде есть несколько проблем.Некоторые могут просто отсутствовать в вашем примере:

Во-первых, ваша привязка к конвертеру не указывает , к чему привязываться, чтобы получить ее значение, поэтому она никогда не вызывается.Как минимум, ему нужен Path = (или просто имя свойства в качестве ярлыка), иначе конвертер не будет вызван.Где вы устанавливаете ItemSource вашего списка?

Во-вторых, передаваемые значения являются именами строковых файлов.Ваш конвертер должен использовать их в качестве имен файлов и открыть поток на основе этого имени.В настоящее время он пытается использовать имена в качестве байтовых массивов.

Наконец, если изображения являются фиксированным набором, было бы более целесообразно хранить их в папке изображений в ClientBin и просто ссылаться на них с помощьюследующий синтаксис пути "/images/imagename.jpg" и т. д. Это будет включать автоматическое кэширование браузера.Вам не нужен конвертер для этого.(Ключ является ведущим «/». Без этого Silverlight предполагает, что изображения находятся в текущем модуле)

alt text

Ниже приведен полный пример с использованием изображений, показанных в ClientBinПапка / images, которая при запуске выглядит следующим образом:

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>

Пример кода:

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 голосов
/ 06 ноября 2010

Возможно, вам не хватает памяти, потому что вы неоднократно загружаете один и тот же файл в новые BitmapSource объекты.Вы должны создать только «около 10» BitmapSource объектов по одному для каждого файла.Затем повторно используйте эти BitmapSource экземпляры, назначив их для Image.Source свойств.

Один из способов сделать это - использовать реализацию IValueConverter, которая поддерживает статический словарь пути к файлу BitmapSourceпары ключ-значение.

...