2011-05-28 106 views
2

我試圖顯示列表框中嵌入我的asssembly中的圖像。我可以使用轉換器將圖像顯示出來,但不是加載,而是靜止不動,它們不斷從組件中重新加載,導致它們閃爍。我使用相同的轉換器來加載我的應用程序周圍的其他地方的圖標,但這個問題不會發生 - 它似乎是以某種方式由lisbox造成的。我嘗試刪除VisualStates並切換轉換器返回的位圖圖像的CreateOption,但我得到相同的結果。我相當確信這在WP7.0上沒有發生,只有7.1。圖像在WP7中閃爍ListBox

的風格是:

<Style x:Key="SnapshotList" TargetType="ListBox"> 
    <Setter Property="Margin" Value="2" /> 
    <Setter Property="BorderThickness" Value="1"/> 
    <!--<Setter Property="Background" Value="{StaticResource WindowBackgroundBrush}" /> 
    <Setter Property="BorderBrush" Value="{StaticResource PhoneBorderBrush}" />--> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/> 
    <!--Setter Property="OverridesDefaultStyle" Value="True"/--> 
    <Setter Property="ItemTemplate" Value="{StaticResource SnapshotTemplate}"/> 
    <Setter Property="ItemsPanel"> 
     <Setter.Value> 
      <ItemsPanelTemplate> 
       <Controls:WrapPanel HorizontalAlignment="Stretch" VerticalAlignment="Top"/> 
         <!--<WP7:BindingHelper.Binding> 
          <WP7:RelativeSourceBinding Path="(FrameworkElement.ActualWidth)" TargetProperty="Width" 
             RelativeMode="FindAncestor" 
             AncestorType="ScrollContentPresenter" /> 
         </WP7:BindingHelper.Binding>--> 
       <!--</Controls:WrapPanel>--> 

      </ItemsPanelTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ListBox"> 
       <Border Name="Border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" 
         BorderBrush="{StaticResource PhoneBorderBrush}" CornerRadius="2"> 
        <ScrollViewer Margin="0"> 
         <ItemsPresenter/> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 

有問題的列表框:

<ListBox x:Name="lstIcon" ItemsSource="{Binding AvailableIcons}" SelectedItem="{Binding Recipe.Icon,Mode=TwoWay}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" SelectionMode="Single" 
    Style="{StaticResource SnapshotList}"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Border Background="Transparent" MinWidth="30" MinHeight="30" Margin="3" Padding="3"> 
      <Image Source="{Binding Converter={StaticResource IconConverter}, ConverterParameter=32}" Stretch="None" MinWidth="30" MinHeight="30" /> 
     </Border> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

轉換器:

public class IconConverter : IValueConverter 
    { 
     private static IEnumerable<string> _names; 
     private static IEnumerable<string> ResourceNames { 
      get { 
       if (_names == null) { 
        _names = WP7Utils.GetResourcePaths(Assembly.GetExecutingAssembly()).Select(p=>System.Convert.ToString(p)).ToList(); 
       } 
       return _names; 
      } 
     } 

     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { 
      string baseFilename = (value ?? Shared.Constants.DefaultIcon).ToString().Trim(); 
      string size = (parameter ?? "32").ToString(); 
      try { 
       BitmapImage img = new BitmapImage(); 
       using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { 
        string fileName = string.Format("{0}_{1}.png", baseFilename, size); 
        img = ResourceHelper.GetBitmap("Resources/types/" + fileName, "MyAssembly"); 
       } 
       return img; 
      } catch (Exception ex) { 
       Console.WriteLine(string.Format("Error loading image {0} ({1}px): {2}", baseFilename, size, ex.Message)); 
      } 
      return value; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { 
      throw new NotImplementedException(); 
     } 
    } 

回答

1

這是由於在ListBox的DataTemplate中指定了MinHeight和MinWidth引起的。刪除屬性解決了問題。

0

您還應該將緩存上的圖像緩存設置爲BitmpaCache,以防止需要重新加載/重繪圖像的框架。