3

私はWPFでScrollViewを使用しています.私のアプリはユーザーがボタンをクリックすることを許可し、スクロールビューを自動スクロールします.ボタンクリックイベントでScrollToVerticalOffset()を使用しますが、スクロールビューは何も変更しません.

この問題についてインターネットで検索しましたが、今のところまだ解決できません。

もう 1 つの質問: ScrollToVerticalOffset() はパラメーターとして double を使用します。特別なピクセルまでスクロールする可能性があります。n 個のアイテム (ピクセルではない) にスクロールする方法はありますか?

これが私のコードです

<ScrollViewer x:Name="scrollViewerChannelBtns" Grid.Row="1" HorizontalAlignment="Left" VerticalAlignment="Center" 
              Background="Transparent" VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden"
              CanContentScroll="True" ScrollChanged="ScrollViewerChannelBtns_ScrollChanged">
    <StackPanel x:Name="channelBtns" Orientation="Vertical">
        <ItemsControl x:Name="channelBtnItems" ItemsSource="{Binding}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <ToggleButton x:Name="tgbChannelName" Width="{Binding Path=ChannelNameBtnWidth}" Height="{Binding Path=ChannelNameBtnHeight}" HorizontalAlignment="Left" VerticalAlignment="Center" IsChecked="{Binding Path=IsChecked, Mode=TwoWay}" Content="{Binding Path=ChannelName}" Tag="{Binding Path=Index}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</ScrollViewer>  

C# コード

//The button click event handled
private void BtnScrollDownClicked(object sender, RoutedEventArgs e)
{                        scrollViewerChannelBtns.ScrollToVerticalOffset(scrollViewerChannelBtns.VerticalOffset + 50);
}
private void BtnScrollUpClicked(object sender, RoutedEventArgs e)
{                        scrollViewerChannelBtns.ScrollToVerticalOffset(scrollViewerChannelBtns.VerticalOffset - 50);
}

どうもありがとう、T&T

4

2 に答える 2

13

私の仕事は後に始まります。

  ScrollViewer.UpdateLayout();                              
  ScrollViewer.ScrollToVerticalOffset(outPoint.Y);
于 2015-04-27T03:57:12.103 に答える
2

私にとって、この例は機能します:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

<Grid>
    <ScrollViewer x:Name="scrollViewerChannelBtns" HorizontalAlignment="Center" Height="100" CanContentScroll="False" VerticalAlignment="Center" 
          Background="Transparent" VerticalScrollBarVisibility="Auto">
        
        <StackPanel x:Name="channelBtns" Orientation="Vertical">
            <ItemsControl x:Name="channelBtnItems">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <ToggleButton x:Name="tgbChannelName" Width="40" Height="20" HorizontalAlignment="Left" VerticalAlignment="Center" IsChecked="{x:Null}" Content="Test" />
                    </DataTemplate>
                </ItemsControl.ItemTemplate>

                <sys:String>Item 1</sys:String>
                <sys:String>Item 2</sys:String>
                <sys:String>Item 3</sys:String>
                <sys:String>Item 4</sys:String>
                <sys:String>Item 5</sys:String>
                <sys:String>Item 6</sys:String>
                <sys:String>Item 7</sys:String>
                <sys:String>Item 8</sys:String>
                <sys:String>Item 9</sys:String>
                <sys:String>Item 10</sys:String>
            </ItemsControl>
        </StackPanel>
    </ScrollViewer>

    <Button Name="Up" Width="50" Height="30" VerticalAlignment="Top" Margin="110,0,0,0" Content="Up" Click="Up_Click" />

    <Button Name="Down" Width="50" Height="30" VerticalAlignment="Top" Margin="210,0,0,0" Content="Down" Click="Down_Click" />
</Grid>

ScrollViewerこの例では、とCanContentScrollsetの高さを設定していfalseます。ScrollViewer.CanContentScroll を false に設定して仮想化を無効にする理由の回答からの引用:

現在、ScrollViewer では 2 つのスクロール モードが許可されています。ピクセルごとのスムーズなスクロール (CanContentScroll = false) または項目ごとの個別のスクロール (CanContentScroll = true) です。現在、WPF はアイテムによるスクロール時にのみ UI 仮想化をサポートしています。ピクセルベースのスクロールは「物理スクロール」とも呼ばれ、項目ベースのスクロールは「論理スクロール」とも呼ばれます。

仮想化には、現在表示されている論理ユニット (アイテム) を追跡できるように、アイテムベースのスクロールが必要です... ScrollViewer をピクセルベースのスクロールに設定することは、論理ユニットの概念ではなく、ピクセルのみです!

Code behind

private void Up_Click(object sender, RoutedEventArgs e)
{
    scrollViewerChannelBtns.ScrollToVerticalOffset(scrollViewerChannelBtns.VerticalOffset - 50);
}

private void Down_Click(object sender, RoutedEventArgs e)
{
    scrollViewerChannelBtns.ScrollToVerticalOffset(scrollViewerChannelBtns.VerticalOffset + 50);
}

スクロール要素はデフォルトではサポートされていないため、次のリンクを確認する必要があります。

連結スクロール - "Pixel by Pixel" + "Item by Item"

ScrollViewer のビューポートの高さ VS 実際の高さ

于 2013-07-26T05:16:34.237 に答える