2011-03-03 3 views
1

실버 라이트로 작업하기 시작한 이래로 이것은 어리석은 질문 일 수 있습니다.실버 라이트와 양방향 데이터 바인딩에서 이미지 캐싱

나는 CollectionViewSource에 바인딩 된 ListBox 컨트롤을 가지고 있으며이 CollectionViewSource는 RIA 서비스로 채워집니다. 데이터 소스의 각 항목에는 서버에있는 이미지의 문자열 URL을 포함하는 ThumbnailPath 속성이 있습니다. 그런 다음 항목 템플릿에 Image 컨트롤과 Image 소스를 설정하는 Source 종속성 속성이있는 사용자 정의 컨트롤이 있습니다. Source는 항목의 ThumbnailPath 속성에 바인딩되며 모든 것이 올바르게 작동합니다.

그러나 Silverlight 응용 프로그램은 ListBox의 필터링 또는 페이징이 수행 될 때마다 서버에서 이미지를 요청합니다. 제 아이디어는 항목에 BitmapImage 필드를 추가하고 이미지 컨트롤의 ImageOpened 이벤트에서이 필드에 이미지를 저장 한 다음 ThumbnailPath 대신 다음에이 이미지를 사용하는 것입니다. 그러나 이것을 구현하는 방법은 무엇입니까? 양방향 바인딩? 나는 2-way 데이터 바인딩에 대해 읽는 데 많은 시간을 보냈지 만 여전히 어떻게해야하는지 모릅니다. 누구든지 좋은 모범이나 기사를 가르쳐 줄 수 있습니까?

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

및 UserControl을 :

<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

실버 라이트 앱이 이미지를 요청 사실 때마다가 아닌

는 항목 템플릿입니다 진짜 문제. 웹 서버에서 캐시 설정을 구성해야합니다 (IIS를 사용하고있는 것 같습니다). 그러면 전체 이미지 스트림이 앞뒤로 이동하지 않습니다.

이렇게하면 별도의 코드가 필요하지 않습니다. (y)

감사합니다,