【问题标题】:Scrolling DataGrid滚动数据网格
【发布时间】:2019-10-08 08:43:32
【问题描述】:

我使用带有特殊滚动功能的 DataGrid,我在 Internet 上进行搜索。 它的工作正常,但是当我在 backcode 上修改 selecteditem 时,rowselection 转到选定的行,但 Scroll 停留在第一个元素,所以如果我用我的按钮转到最后一个,我看不到第 20 个元素。 在我使用 first、prev、next、last 按钮的代码中,搜索索引移动 - 但这些不与 Scroll 通信,为什么? 这是我的导航:

如果我 Key.Up,Key.Down 与滚动通信良好,但是当我从 1 到 20 时,我发送 19XKey.Down?我想也许是一个简单的方法,只是我不明白。 现在我的按钮将 Mvvm light CollectionViewsource AktItem 设置为下一个、最后一个等,并通过 SelectedItem、IssynchtonizedCurrent 获得焦点返回,但滚动不动。

感谢每一个帮助 史蒂夫

<ControlTemplate TargetType="{x:Type DataGrid}" x:Key="DataGridWithNavigation">

        <Border BorderBrush="{TemplateBinding BorderBrush}" 
                                    BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" 
                                    Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True">

            <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false">
                <ScrollViewer.Template>                    
                <ControlTemplate TargetType="{x:Type ScrollViewer}">
                    <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="*"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                        <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" 
                                Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}"                        
                                                        Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
                                                        Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                        <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter"
                                                                                Grid.Column="1" 
                                                                                Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                            <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" 
                                                                        CanContentScroll="{TemplateBinding CanContentScroll}" 
                                                                        Grid.ColumnSpan="2" Grid.Row="1"/>
                            <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" 
                                                           Maximum="{TemplateBinding ScrollableHeight}" 
                                                           Orientation="Vertical" Grid.Row="1" 
                                                           Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
                                         Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"

                                                           ViewportSize="{TemplateBinding ViewportHeight}"/><!--Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"-->
                        <Grid Grid.Column="1" Grid.Row="2">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <view:BindingNavigatorAreaScroll x:Name="BNA_Scroll" Grid.Column="1"/>
                                <ScrollBar x:Name="PART_HorizontalScrollBar" 
                                                   Grid.Column="2" 
                                                   Maximum="{TemplateBinding ScrollableWidth}" 
                                                   Orientation="Horizontal" 
                                                    Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                                   Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                                                   ViewportSize="{TemplateBinding ViewportWidth}"
                                                  />
                                <!-- Template="{StaticResource yourCustomTemplate}" Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"-->
                                <!--<TextBlock  Text="{TemplateBinding ComputedVerticalScrollBarVisibility}"   Grid.Column="2"/>-->
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </ScrollViewer.Template>
                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            </ScrollViewer>
        </Border>
    </ControlTemplate>

【问题讨论】:

    标签: c# wpf datagrid scrollviewer


    【解决方案1】:

    可能实现您想要的最简单的方法是使用 DataGrid.ScrollIntoView(object) 方法响应视图代码中按钮的单击事件:

    在 XAML 中:

    <Button Content="Content"
            Click="Button_Click"/>
    

    在代码隐藏中:

     private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
            {
                DG.ScrollIntoView(DG.Items[item]);
            }
    

    其中 Dg 是您在 XAML 中指定的数据网格的 Nameitem 是您要滚动到的项目。

    【讨论】:

    • 谢谢我用私有的 void DataGridBase_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (SelectedItem != null) { ScrollIntoView(SelectedItem);更新布局(); } } UpdateLayout() - 解决我的刷新。 --------------------------------------------- 你能帮助如何保持如果我在外部单击,则关注实际的 datagridrow,但 rowvalidating 有错误?或者需要在另一个问题中对此提出质疑?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多