Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Анимационная прокрутка ScrollViewer


Автор: Casy84 7.2.2016, 09:47
Добрый день! 

Есть такая проблема, самому решить не получается. В общем, есть пользовательский контрол, у которого по бокам две кнопки, а между ними StackPanel, заключенная в ScrollViewer, в которой располагаются нужные элементы. 

Задача - при нажатии на кнопки влево или вправо проматывать содержимое. И делать это плавно, а не просто увеличив значение отступа у ScrollViewer. Пробовал несколько способов: 
1. Вызывал ScrollToHorizontalOffset по таймеру со сдвигом на несколько пикселей. Но тут анимация получается медленная. Хотя на DispatcherTimer ставил интервалы по 10 тиков, скорости это не прибавляло.
2. Пробовал сделать анимацию Storyboard. На свойство HorizontalOffset у ScrollViewer, но вылетает исключение, что анимацию на это свойство вешать нельзя. 
3. Пробовал играть через анимацию с Margin у StackPanel. В принципе нужного эффекта я добился. Анимация и быстрая и плавная. Но по моему это уже костыли, и должен быть более адекватный способ.

XAML выглядит так: 
Код

    <Grid VerticalAlignment="Center" Height="173" Width="980">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="36"/>
            <ColumnDefinition/>
            <ColumnDefinition Width="36"/>
        </Grid.ColumnDefinitions>
        <Button Grid.Column="0" Name="btTestPanelLeft" Content="<-" Height="47" Width="17" Cursor="Hand" Focusable="False" Click="btTestPanelLeft_Click" />
        <ScrollViewer Grid.Column="1" VerticalScrollBarVisibility="Hidden" Name="testScroll" HorizontalScrollBarVisibility="Hidden">
            <StackPanel Orientation="Horizontal" Name="testContainer">
                <Button Name="button1" Width="220" Height="170" Margin="0,0,25,0" Content="..." />
                <Button Name="button2" Width="220" Height="170" Margin="0,0,25,0" Content="..." />
                <Button Name="button3" Width="220" Height="170" Margin="0,0,25,0" Content="..." />
                <Button Name="button4" Width="220" Height="170" Margin="0,0,25,0" Content="..." />
                <Button Name="button5" Width="220" Height="170" Margin="0,0,25,0" Content="..." />
                <Button Name="button6" Width="220" Height="170" Margin="0,0,25,0" Content="..." />
            </StackPanel>
        </ScrollViewer>
        <Button Grid.Column="2" Name="btTestPanelRight" Content="->" Height="47" Width="17" Cursor="Hand" Focusable="False" Click="btTestPanelRight_Click" />
    </Grid>


Есть у кого-нибудь идеи, что можно сделать в моей ситуации? Я в WPF не очень опытен, может я просто начал копать не в ту сторону? 

Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)