4

メッセージを表示するために LongListMultiSelector を使用しています。メッセンジャーのように、最新のメッセージはボタンにあります。ListHeaderTemplate にボタンがあることは知っています。これにより、以前のメッセージを読み込んでリストの上部に挿入できます ( ObservableCollection.Insert(0, item);)。

挿入は機能しますが、リストは最後に挿入されたアイテムに自動的にスクロールするように見えます-実際にはスクロールしませんが、挿入後に新しいアイテムが表示されるため、スクロールするように感じますが、むしろ解決策を探しています挿入された新しいアイテムの前の最初のアイテムを表示したままにし、リストヘッダーに再び到達するには、新しい上部にもう一度垂直スクロールする必要があります。

手がかりはありますか?

編集1

が現在の最初のアイテムであると考えてから、oldFirstItemそのアイテムの前に新しいアイテムを挿入します。新しいアイテムが最初のアイテムになり、スクロール位置が変わらないため、新しいアイテムが表示されます。リストが新しく挿入されたアイテムまでスクロールするように感じますが、アイテム 1 から n を下に押しただけです。私が望むのは、すべての新しいアイテムをユーザーが見えない領域に押し上げ、表示されてoldFirstItemいるアイテムの上部に押し上げることです。ScrollTo を使用すると、そのリストがジャンプします。

EDIT 2 達成したいことを示すために写真を追加しました。赤い線より上の領域は表示されません。ここに画像の説明を入力

4

4 に答える 4

-1

監視可能なコレクションの先頭に新しいアイテムを追加することで、これを簡単に実現できます

obsData.Insert(0,newItem)

参照

于 2013-11-28T13:30:21.560 に答える
-1

あなたを始めるために、私は何かを試しましたが、100%取得できませんでした

これは、実際にメッセージで必要なことを行う基本的なページテンプレートです。

<phone:PhoneApplicationPage >

<ScrollViewer x:Name="Scroll" VerticalAlignment="Bottom" Height="500" ScrollViewer.VerticalScrollBarVisibility="Disabled">
    <StackPanel VerticalAlignment="Bottom" >
        <toolkit:LongListMultiSelector x:Name="DataList" ItemsSource="{Binding}" ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Bottom"
        VirtualizingStackPanel.VirtualizationMode="Recycling"></toolkit:LongListMultiSelector>
    </StackPanel>
</ScrollViewer>

</phone:PhoneApplicationPage>

これにより、新しいメッセージが表示されなくなり、リストが表示されます。スクロールが無効になりました。ScrollViewer をグリッドで簡単に囲み、上のボタンを追加できます(写真のように)

ボタンクリックに入るコード

    Scroll.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
    Scroll.ScrollToVerticalOffset(DataList.ActualHeight);

残念ながら、これはリストを上にスクロールしますが、ボタンのクリックなどでコードの 2 行目を再度トリガーすると、ScrollToVerticalOffset が機能します。そのため、VerticalScrollBarVisibility を変更した後、何らかの理由で ScrollToVerticalOffset がすぐに機能しません。この最後の部分を理解できれば、あなたの質問は解決されると思います

于 2013-11-28T01:56:49.530 に答える
-1

目的の効果を妨げるのは、項目を一番上に挿入すると ListHeader コントロールが一番上にあることです。それを回避するために、いくつかのトリッキーなコードを実行できます。

var temp = MyLongListMultiSelector.ListHeader; //also works with ListHeaderTemplate
MyLongListMultiSelector.ListHeader = null;
MyObservableCollection.Insert(0, item);    
MyLongListMultiSelector.ListHeader = temp;

または、偽のヘッダー アイテムを作成して、次のように add top イベントを処理することもできます。

MyLongListMultiSelector.Remove(fakeHeaderItem);
MyObservableCollection.Insert(0, item); 
MyObservableCollection.Insert(0, fakeHeaderItem); 
于 2013-11-28T11:10:15.257 に答える
-2

私が見るなら...ScrollToメソッドを使用できます。

yourLongListMultiSelector.ScrollTo(yourNewInsertedItem);
于 2013-11-19T18:41:10.543 に答える