Кэширование изображений в Silverlight и двусторонняя привязка данных - PullRequest
1 голос
/ 03 марта 2011

Может быть, это глупый вопрос, потому что я только начал работать с silverlight.

У меня есть элемент управления ListBox, который связан с CollectionViewSource, и этот CollectionViewSource заполняется службами RIA. Каждый элемент в источнике данных имеет свойство ThumbnailPath, содержащее строковый URL-адрес изображения на сервере. Затем в шаблоне элемента у меня есть пользовательский элемент управления, который имеет элемент управления Image и свойство зависимостей Source для установки источника изображения. Источник привязан к свойству ThumbnailPath элемента, и все работает нормально.

Однако приложение silverlight запрашивает изображения с сервера каждый раз, когда выполняется фильтрация или разбиение на страницы ListBox. Моя идея состоит в том, чтобы добавить поле BitmapImage к элементу и сохранить изображение в этом поле в событии ImageOpened элемента управления Image, а затем использовать это изображение в следующий раз вместо ThumbnailPath. Но как это реализовать? Двухстороннее связывание? Я провел много времени, читая о двухстороннем связывании данных, но все еще не знаю, как это сделать. Может кто-нибудь указать мне хороший пример или статью?

Это шаблон элемента:

<ControlTemplate x:Key="ItemTemplate">
        <Grid Width="104" Height="134" Margin="0,0,5,5" Background="White" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Border BorderBrush="#FF000000" BorderThickness="2, 2, 2, 2" Margin="0,0,0,0" CornerRadius="0" />
            <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
                <my:ImageProgress Source="{Binding ThumbPath}"></my:ImageProgress>
                <Grid Background="White" Margin="0,110,0,0" Opacity="0.5" Width="100" Height="20">
                </Grid>
                <TextBlock Text="{Binding Name}" HorizontalAlignment="Center" Margin="0,110,0,0">
                </TextBlock>
            </Grid>
        </Grid>
    </ControlTemplate>

и контроль пользователя:

<Grid x:Name="LayoutRoot" Background="Transparent" Width="100" Height="100">
    <Image x:Name="Image" Stretch="Uniform" ImageFailed="ImageFailed" ImageOpened="ImageOpened">
    </Image>
    <TextBlock x:Name="FailureText" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="10"  TextWrapping="Wrap" Margin="20,0,20,0" Visibility="Collapsed">
        image not found
    </TextBlock>
</Grid>

контрольный код:

public partial class ImageProgress : UserControl
{
    public ImageProgress()
    {
        InitializeComponent();
    }

    public BitmapImage Source
    {
        get { return (BitmapImage)GetValue(SourceProperty); }
        set
        {
            SetValue(SourceProperty, value);
            Image.Source = value;
        }
    }

    public static readonly DependencyProperty SourceProperty = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(ImageProgress), new PropertyMetadata(new PropertyChangedCallback(OnSourceChanged)));

    private static void OnSourceChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var source = sender as ImageProgress;
        if (source != null)
        {
            source.Source = (BitmapImage) e.NewValue;
        }
    }

    void ImageFailed(object sender, ExceptionRoutedEventArgs e)
    {
        var img = (Image) sender;
        FailureText.Visibility = Visibility.Visible;
        img.Visibility = Visibility.Collapsed;
    }

    private void ImageOpened(object sender, RoutedEventArgs e)
    {
        var img = (Image)sender;
        // ???
    }
}

1 Ответ

1 голос
/ 22 июня 2011

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

Для этого не требуется никакого дополнительного кода.(у)

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...