Используйте пользовательский ScrollViewer с WPF DataGrid, чтобы получить анимированную прокрутку - PullRequest
0 голосов
/ 11 июля 2019

У меня есть сетка данных, которая AutoScrolls основана на воспроизведении видео (субтитры), которая отлично работает, но я хочу плавную прокрутку (анимация). Я попробовал AniScrollViewer здесь , но он не работает.Никаких исключений или ничего только прокрутка.Что я делаю неправильно??Обратите внимание, что при печати x и y на консоли были правильно изменены значения y.

<local:AniScrollViewer Grid.Row="0" VerticalScrollBarVisibility="Disabled" 
                           HorizontalScrollBarVisibility="Disabled" x:Name="mainViewer" 
                           HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                <DataGrid  IsReadOnly="True" AutoGenerateColumns="false" 
                ItemsSource="{Binding}" CanUserSortColumns="False"
                CanUserResizeColumns="false" CanUserAddRows="False"
                x:Name="datagrid" HorizontalAlignment="Left" Height="243" 
                Margin="0,41,0,0" VerticalAlignment="Top" 
                EnableRowVirtualization="false"
                Width="679" 
                VirtualizingPanel.IsVirtualizing="True"
                ScrollViewer.VerticalScrollBarVisibility="Auto" 
                ScrollViewer.HorizontalScrollBarVisibility="Disabled" SelectionMode="Single" 
                PreviewMouseRightButtonUp="DataGrid_Right_Click" >

                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Character" Width="SizeToCells" Binding="{Binding Character}"/>
                        <DataGridTextColumn Header="Timecode In" Width="SizeToCells" Binding="{Binding TimecodeIn, Converter={StaticResource timecodeConverter}}" />
                        <DataGridTextColumn Header="Timecode Out" Width="SizeToCells" Binding="{Binding TimecodeOut, Converter={StaticResource timecodeConverter}}" />
                        <DataGridTemplateColumn Header="Dialogue"  Width="*">
                            <DataGridTemplateColumn.CellTemplate>
                                <DataTemplate DataType="{x:Type conv:mGridEntry}">
                                    <TextBlock Text="{Binding Text}" TextWrapping="Wrap"/>
                                </DataTemplate>
                            </DataGridTemplateColumn.CellTemplate>
                        </DataGridTemplateColumn>
                    </DataGrid.Columns>
                    <DataGrid.ColumnHeaderStyle>
                        <Style TargetType="{x:Type DataGridColumnHeader}">
                            <Setter Property="FontFamily" Value="Arial" />
                            <Setter Property="FontSize" Value="12"/>
                            <Setter Property="HorizontalContentAlignment" Value="Center"/>
                        </Style>
                    </DataGrid.ColumnHeaderStyle>


                    <DataGrid.CellStyle>
                        <Style TargetType="{x:Type DataGridCell}">
                            <Setter Property="Padding" Value="6"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                                        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                            <ContentPresenter VerticalAlignment="Center" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                        </Border>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                            <Style.Triggers>

                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="Background" Value="LightBlue"/>
                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                                </Trigger>
                            </Style.Triggers>
                        </Style>
                    </DataGrid.CellStyle>
                    <DataGrid.RowStyle>
                        <Style TargetType="{x:Type DataGridRow}">
                            <Setter Property="Background" Value="{Binding Character, Converter={StaticResource namebrushConverter}}"/>
                        </Style>
                    </DataGrid.RowStyle>

                </DataGrid>
            </local:AniScrollViewer>

И код:

DataGridRow row = Grid.ItemContainerGenerator.ContainerFromIndex(scrollindex) as DataGridRow;
Point relativePoint = row.TransformToAncestor(Grid).Transform(new Point(0, 0));
ScrollToPosition(relativePoint.X, relativePoint.Y);
private static void ScrollToPosition(double x, double y)
        {
            DoubleAnimation vertAnim = new DoubleAnimation();
            vertAnim.From = mScrollViewer.VerticalOffset;
            vertAnim.To = y;
            vertAnim.DecelerationRatio = .2;
            vertAnim.Duration = new Duration(TimeSpan.FromMilliseconds(1000));
            Storyboard sb = new Storyboard();
            sb.Children.Add(vertAnim);
            Storyboard.SetTarget(vertAnim, mScrollViewer);
            Storyboard.SetTargetProperty(vertAnim, new PropertyPath(AniScrollViewer.CurrentVerticalOffsetProperty));
            sb.Begin();
        }
...