5

ISupportIncrementalLoadingでの増分読み込みのために WinRT に実装しましたがListView、うまく機能します。問題は、新しいアイテムがリストの一番下に追加されることです。さらにアイテムを表示するには、下に移動する必要があります。私が必要とするのは反対です。より多くのアイテムを表示するには、上にスクロールする必要があります。リストは基本的にログ ファイルであり、最新の日付がリストの一番下に表示されている必要があります。古いレコードを見たい場合は、スクロール アップを使用する必要があります。

それを行う方法はありますか?

4

2 に答える 2

7

質問は古いですが、同じ問題があり、良い解決策が見つかりませんでした。

だから私は同じ問題を抱えている他の人のために私の解決策を投稿します。

私の最初の解決策は、データをスクロールしてロードするためのカスタム動作を備えた独自の IncrementalLoadCollection でした。問題なく動作しますが、私には十分ではありません。

そこで、別の強力な XAML トリックを試してみたところ、マウス ホイールの小さな動作を除いて、完全に機能しました。今は逆になっています:)。

ソリューションは非常にシンプルで強力です。ListView の ScrollViewer を 180° 回転させて反転させるだけで、スクロールバーが再び右側に表示されます。次に、アイテムに対して同じことを行い、再び正しいようにします。

それでおしまい。インクリメンタル ロードは ListView によって処理され、タッチ イベントとスクロールバーは正しく機能します。マウス ホイールの動作が逆になっただけです。

私のコード

<ListView Grid.Row="1" x:Name="ChatListView" ItemsSource="{TemplateBinding ItemsSource}" 
                              SelectionMode="None"
                              IsItemClickEnabled="False"
                              IsZoomedInView="False"
                            ShowsScrollingPlaceholders="False"
                            VerticalContentAlignment="Top" 
                              VerticalAlignment="Stretch" 
                              Margin="10,5">
                        <ListView.ItemContainerStyle>
                            <Style TargetType="ListViewItem">
                                <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="ListViewItem">
                                            <ContentPresenter/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </ListView.ItemContainerStyle>
                        <ListView.ItemContainerTransitions>
                            <TransitionCollection/>
                        </ListView.ItemContainerTransitions>
                        <ListView.Template>
                            <ControlTemplate>
                                <Border BorderThickness="{TemplateBinding BorderThickness}"
                                        Padding="{TemplateBinding Padding}"
                                        BorderBrush="{TemplateBinding BorderBrush}"
                                        Background="{TemplateBinding Background}">
                                    <ScrollViewer ZoomMode="Disabled" x:Name="ScrollViewer" RenderTransformOrigin="0.5,0.5">
                                        <ScrollViewer.RenderTransform>
                                            <CompositeTransform Rotation="180" ScaleX="-1"/>
                                        </ScrollViewer.RenderTransform>
                                        <ItemsPresenter x:Name="ItemsPresenter"/>
                                    </ScrollViewer>
                                </Border>
                            </ControlTemplate>
                        </ListView.Template>
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <controls:ChatMessageControl Message="{Binding Message}"
                                                             ChatFrom="{Binding Name}"
                                                             IsMy="{Binding IsMy}"
                                                             ShortTime="{Binding CreatedTime}"
                                                             RenderTransformOrigin="0.5,0.5">

                                    <controls:ChatMessageControl.RenderTransform>
                                        <CompositeTransform Rotation="180" ScaleX="-1"/>
                                    </controls:ChatMessageControl.RenderTransform>
                                </controls:ChatMessageControl>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
于 2014-09-10T12:05:40.603 に答える
2

Demetrius Axenowskiの回答を参照すると、これはマウスホイール入力を逆にする私のアプローチです。

私はこれをデスクトップ専用アプリに使用しています

1) ListView の ScrollViewer 内で最初の Grid を見つけ、PointerWheelChanged イベントをフックします。

        this._ScrollViewer = this.GetChildren<ScrollViewer>().FirstOrDefault();
        if (this._ScrollViewer == null)
        {
            throw new InvalidOperationException("ScrollViewer not found.");
        }

        this._ScrollViewerInsetBorder = this.GetChildren<Border>().FirstOrDefault();

        this._BorderInsetGrid = this.GetChildren<Grid>().FirstOrDefault();
        this._BorderInsetGrid.AddHandler(ScrollViewer.PointerWheelChangedEvent, new PointerEventHandler(this.SW_Handler_OnPointerWheelChanged), true);

2)マウスホイールの動作をオーバーライドします。

    double desiredVerticalOffset = 0;
    private void SW_Handler_OnPointerWheelChanged(object sender, PointerRoutedEventArgs e)
    {
        PointerPoint mousePosition = e.GetCurrentPoint(sender as UIElement);
        var delta = mousePosition.Properties.MouseWheelDelta;

        // calculate desiredOffset
        desiredVerticalOffset = desiredVerticalOffset + delta;

        // limit desiredOffset.
        desiredVerticalOffset = desiredVerticalOffset < 0 ? 0 : desiredVerticalOffset;
        desiredVerticalOffset = desiredVerticalOffset > _ScrollViewer.ScrollableHeight ? _ScrollViewer.ScrollableHeight : desiredVerticalOffset;

        if (delta < 0 || delta > 0)
        {
            _ScrollViewer.ChangeView(null, desiredVerticalOffset, null, false);
            e.Handled = true;
        }
    }
于 2015-11-09T13:12:04.967 に答える