Мерцание изображения в WP7 ListBox - PullRequest
2 голосов
/ 28 мая 2011

Я пытаюсь отобразить список изображений, встроенных в мою сборку, в ListBox. Я могу заставить изображения отображаться с помощью конвертера, но вместо того, чтобы загружать, а затем оставаться на месте, они постоянно перезагружаются из сборки, заставляя их мерцать. Я использую тот же конвертер для загрузки значков в другие места вокруг моего приложения, но эта проблема не возникает - похоже, она как-то вызвана lisbox. Я попытался удалить VisualStates и переключить CreateOption для растрового изображения, которое возвращает конвертер, но я получаю тот же результат. Я вполне уверен, что этого не произошло на WP7.0, только 7.1.

Стиль:

<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();
        }
    }

Ответы [ 2 ]

1 голос
/ 29 мая 2011

Это было вызвано указанием MinHeight и MinWidth в шаблоне данных для ListBox.Удаление атрибутов решило проблему.

0 голосов
/ 30 мая 2011

Также следует установить кэширование для кэширования на изображении на BitmpaCache, чтобы избежать необходимости в каркасе для перезагрузки / перерисовки изображения.

...