滚动数据网格
Scrolling DataGrid
我使用在 Internet 上搜索的具有特殊滚动功能的 DataGrid。
它的工作正常,但是当我修改 backcode 上的 selecteditem 时,rowselection 转到选定的行,但是 Scroll 停留在第一个元素,所以如果我用我的按钮走到最后,我看不到第 20 个元素。
在我使用的代码中,first、prev、next、last 按钮、搜索索引移动 - 但这些不与 Scroll 通信,为什么?
这是我的导航:
如果我Key.Up,Key.Down那个和scroll沟通的很好,但是当我从1号到20号的时候我发送19XKey.Down?我想也许是一种简单的方法,只是我不明白。
现在我的按钮将 Mvvm light CollectionViewsource AktItem 设置为下一个,最后一个等等,并且通过 SelectedItem,IssynchtonizedCurrent 获得焦点 return,但滚动不动。
谢谢大家的帮助
史蒂夫
<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>
实现您想要的效果的最简单方法可能是使用 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 中指定的数据网格的 Name
,item
是您要滚动到的项目。
我使用在 Internet 上搜索的具有特殊滚动功能的 DataGrid。 它的工作正常,但是当我修改 backcode 上的 selecteditem 时,rowselection 转到选定的行,但是 Scroll 停留在第一个元素,所以如果我用我的按钮走到最后,我看不到第 20 个元素。 在我使用的代码中,first、prev、next、last 按钮、搜索索引移动 - 但这些不与 Scroll 通信,为什么? 这是我的导航:
如果我Key.Up,Key.Down那个和scroll沟通的很好,但是当我从1号到20号的时候我发送19XKey.Down?我想也许是一种简单的方法,只是我不明白。 现在我的按钮将 Mvvm light CollectionViewsource AktItem 设置为下一个,最后一个等等,并且通过 SelectedItem,IssynchtonizedCurrent 获得焦点 return,但滚动不动。
谢谢大家的帮助 史蒂夫
<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>
实现您想要的效果的最简单方法可能是使用 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 中指定的数据网格的 Name
,item
是您要滚动到的项目。