6

Windows Phone Toolkitの最新の更新により、MangoリリースのLongListSelectorの内部が見直されました。変更の1つは、関数のサポートを削除することでしたGetItemsInView()(空のリストを返すようになりました)。この関数は、以前は画面に現在表示されているアイテムのリストを返していました。これを使用して、ページから移動するときに一番上に表示されるアイテムへの参照を取得し、を使用して墓石の後の回復をサポートできるようにしましたScrollTo(object item)

誰かが提案された代替案が何であるか知っていますか?Mangoのトゥームストーニングでは問題がはるかに少ないことは知っていますが、それでもサポートしたいと思います。スクロール位置を思い出したいシナリオが他にもあるかもしれません。私のリストには、場合によっては何千ものアイテムがあります。

4

3 に答える 3

4

新しいビットからわかることから、LLSLinkUnlinkイベントにサブスクライブする必要があります。LinkLLS の可視部分に追加されたアイテムを含む引数を渡します。UnlinkLLS から削除されたアイテムについても同じことを行います。したがって、次のようにします。

List<string> trackedItems = new List<string>();

private void myListOfStrings_Link(object sender, LinkUnlinkEventArgs e)
{
    var x = e.ContentPresenter;
    if (x == null || x.Content == null)
        return;
    trackedItems.Add(x.Content.ToString());
}

private void myListOfString_Unlink(object sender, LinkUnlinkEventArgs e)
{
    var x = e.ContentPresenter;
    if (x == null || x.Content == null)
        return;
    trackedItems.Remove(x.Content.ToString());
}

Linkandは、基になるリスト内のすべてのレンダリングされたアイテムに対して起動することに注意してUnlinkください。したがって、LLS のグループ化機能を使用している場合は、実際のタイプに基づいてアイテムを追跡するかどうかのテストを強化する必要があります。戻ってくる。したがって、基になるオブジェクトを追跡したいある種のグループ オブジェクトがある場合は、次のようにすることができます。

private void myGroupedListOfObjects_Link(object sender, LinkUnlinkEventArgs e)
{
    var x = e.ContentPresenter;
    if (x == null || x.Content == null)
        return;
    var myObject = x.Content as MyObject;
    if (myObject != null)
    {
        foreach (var item in myObject.Items)
        {
            trackedItems.Add(item);
        }
    }
}

これが役立つことを願っています!うまくいくかどうかお知らせください。

于 2011-08-23T20:59:30.337 に答える
3

は内部LongListSelectorで を使用しています(明らかに 2011 年 8 月のリリース以降)。この事実は、ピボット コントローラーのhttp://damianblog.com/2011/01/21/wp7-scroll-pivot/ScrollViewerに示されている例に従って、廃棄後にリストの位置を復元するために使用できます。

スクロールOnNavigatedFrom()オフセットを覚えておいてください:

    private bool _newPageInstance = true;
    private double _scollOffset = double.NaN;

    protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);

        var scrollViewer = FindScrollViewer(LongList);
        State["scrollViewer.VerticalOffset"] = scrollViewer.VerticalOffset;
        State["PreservingPageState"] = true;
        _newPageInstance = false;
    }

    private static ScrollViewer FindScrollViewer(DependencyObject parent)
    {
        var childCount = VisualTreeHelper.GetChildrenCount(parent);
        for (var i = 0; i < childCount; i++)
        {
            var elt = VisualTreeHelper.GetChild(parent, i);
            if (elt is ScrollViewer) return (ScrollViewer)elt;
            var result = FindScrollViewer(elt);
            if (result != null) return result;
        }
        return null;
    }

OnNavigatedTo()アプリが廃棄されている場合は、復元します。

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        if (!_newPageInstance || !State.ContainsKey("PreservingPageState"))
        {
            return;
        }

        _scollOffset = (double)State["scrollViewer.VerticalOffset"];
    }

    private void LongList_Loaded(object sender, RoutedEventArgs e)
    {
        if (double.IsNaN(_scollOffset)) return;

        var longListSelector = (LongListSelector)sender;
        var scrollViewer = FindScrollViewer(longListSelector);
        scrollViewer.ScrollToVerticalOffset(_scollOffset);
        _scollOffset = double.NaN;
    }
于 2012-01-19T03:52:23.360 に答える
2

リンク/リンク解除のアプローチは、スクロール位置を復元するためにまったく機能しません。コレクションをセットアップしても、上下にスクロールしているかどうかはわかりません。コレクションのサイズは、のBufferSizeプロパティによって異なりますLongListSelector

FindScrollViewerただし、kvakuloの回答の解決策は機能します。

このコードの VB.Net バージョンが必要な場合:

Friend Function FindScrollViewer(parent As DependencyObject) As ScrollViewer

    Dim childCount = VisualTreeHelper.GetChildrenCount(parent)

    For i As Int32 = 0 To childCount - 1

        Dim elt = VisualTreeHelper.GetChild(parent, i)

        If elt.GetType Is GetType(ScrollViewer) Then Return CType(elt, ScrollViewer)

        Dim result = FindScrollViewer(elt)
        If result IsNot Nothing Then Return result

    Next

    Return Nothing

End Function
于 2012-03-02T00:08:13.460 に答える