0

私はWindows Phone 7用にこのアプリを作成しています。カメラロール、保存された写真、その他のフォルダーからすべての画像を取得し、それらをラップパネル内のリストボックスに表示して、並べて表示します....サムネイルの画像が実際に表示されます...しかし、画像の数が増えるにつれて、UIが非常に遅くなり、スクロールに時間がかかります...

多くの投稿やその他の質問を読みました。データの仮想化または遅延読み込みが必要だと思いますが、それをどのように使用できるかわかりません。shawn oster と peter torr からの投稿を見ました.....

バックグラウンドワーカーを使用して画像をロードします...方法は次のとおりです...

 void backroungWorker1_DoWork(object sender, DoWorkEventArgs e)
    {

        Dispatcher.BeginInvoke(() =>
        {
            foreach (string fileName in fileStorage.GetFileNames("images//*.*"))
            {
                if (fileName == null)
                    break;
                string filepath = System.IO.Path.Combine("images", fileName);
                try
                {
                    using (IsolatedStorageFileStream imageStream = fileStorage.OpenFile(filepath, FileMode.Open))
                    {
                        var imageSource = PictureDecoder.DecodeJpeg(imageStream);
                        BitmapImage bitmapImage = new BitmapImage();
                        bitmapImage.SetSource(imageStream);
                        var item = new ImageToName { bmp = bitmapImage, FileName = fileName };
                        vltBitmapImage.Add(item);
                        imageStream.Dispose();
                        imageStream.Close();
                    }
                }
                catch
                {
                    Exception x = new Exception();
                }
            }
            if (vltBitmapImage.Count() != 0)
            {
                lone.Visibility = Visibility.Collapsed;
                this.vaultbox.ItemsSource = vltBitmapImage;
            }
            else
                lone.Visibility = Visibility.Visible;
        });
    }

どんな助けでも大歓迎です.....初心者でごめんなさい...

4

2 に答える 2

0

コードプロジェクトからこのサンプルを試してみてください。それがどのように機能するかを説明し、完全なサンプルプロジェクトが付属しています

参照:ユーザーがリストの最後までスクロールしたときのデータのロード

于 2013-01-10T21:35:09.990 に答える
0

リストボックスに遅延ロードを追加する場合は、リスト ボックスのリスナをセットアップし、データ モデルにデータをロードする方法を変更する必要があります。そのため、最初にリストボックスの XAML コードでセットアップしないようにします。

ページ リソースにこのスタイルを追加し、読み込まれたイベントに ("ScrollViewer_Loaded") が含まれていることに注意してください。

...
  <phone:PhoneApplicationPage.Resources>
    <Style x:Key="BusinessListBoxStyle"
           TargetType="ListBox">
        <Setter Property="Background"
                Value="Transparent" />
        <Setter Property="Foreground"
                Value="{StaticResource PhoneForegroundBrush}" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility"
                Value="Disabled" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility"
                Value="Auto" />
        <Setter Property="BorderThickness"
                Value="0" />
        <Setter Property="BorderBrush"
                Value="Transparent" />
        <Setter Property="Padding"
                Value="0" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBox">
                    <ScrollViewer x:Name="scrollViewer"
                                  BorderBrush="{TemplateBinding BorderBrush}"
                                  BorderThickness="{TemplateBinding BorderThickness}"
                                  Background="{TemplateBinding Background}"
                                  Foreground="{TemplateBinding Foreground}"
                                  Padding="{TemplateBinding Padding}"
                                  Loaded="ScrollViewer_Loaded">
                        <ItemsPresenter />
                    </ScrollViewer>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</phone:PhoneApplicationPage.Resources>

...

リストボックスのスタイルへの参照を追加し、itemsSource を viewModel のアイテムのリストにバインドします。

...
        <ListBox x:Name="myList"
                 ItemsSource="{Binding myDataSource}"
                 Style="{StaticResource BusinessListBoxStyle}">

...

次に、リスト内のリスト要素の最後に到達したときに、データをデータモデルにロードするコードを設定する必要があります (データモデルは、モードへのデータのロードを開始し、アイテムを追加します)。

私が通常これを行う方法は、リストボックスのスクロールバーの垂直オフセットにリストすることです。それが端から約 1/4 の場合、データモデルにさらに項目をロードし始めます。DependencyProperty を使用して、VertialOffset リスナーに設定した ScrollViewer ロード済みハンドラーで、以下のコードを参照してください。

        public static readonly DependencyProperty ListVerticalOffsetProperty =
        DependencyProperty.Register(
                                    "ListVerticalOffset",
                                    typeof(double),
                                    typeof(MyPage),
                                    new PropertyMetadata(new PropertyChangedCallback(OnListVerticalOffsetChanged))
                                    );

    private ScrollViewer _listScrollViewer;

    private void ScrollViewer_Loaded(object sender, RoutedEventArgs e)
    {
        _listScrollViewer = sender as ScrollViewer;

        Binding binding = new Binding();
        binding.Source = _listScrollViewer;
        binding.Path = new PropertyPath("VerticalOffset");
        binding.Mode = BindingMode.OneWay;
        this.SetBinding(ListVerticalOffsetProperty, binding);
    }

    public double ListVerticalOffset
    {
        get { return (double)this.GetValue(ListVerticalOffsetProperty); }
        set { this.SetValue(ListVerticalOffsetProperty, value); }
    }

    private double _lastFetch;

    private static void OnListVerticalOffsetChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        MyPage page = obj as MyPage;
        ScrollViewer viewer = page._listScrollViewer;

        if (viewer != null)
        {
            if (page._lastFetch < viewer.ScrollableHeight)
            {
                // Trigger within 1/4 the viewport.
                if (viewer.VerticalOffset >= (viewer.ScrollableHeight - (viewer.ViewportHeight / 4)))
                {
                    page._lastFetch = viewer.ScrollableHeight;
                    MyViewModel _tmpviewmodel = page.DataContext as MyViewModel;

                    if ((_tmpviewmodel != null) && (_tmpviewmodel.HasMoreItems))
                        _tmpviewmodel.GetMoreItems();
                }
            }
        }
    }

ここで、リストボックスがバインドされたすべてのアイテムを保持し、データベース、孤立ストア、Web、または必要なものからアイテムをロードするためのメソッドを持つ MyViewModel を使用することに注意してください。

データの一部のみをビューモデルにロードする方法を見つける必要があります。あなたの場合、最初にロードする必要があるすべてのファイルのリストをロードします (つまり、IsoLatedStore の GetFileNames からリストを取得するだけです)。その後、一度に20枚の写真しかロードしないかもしれません!

于 2013-01-11T09:25:07.487 に答える