Silverlight数据网格虚拟化在滚动中创建问题

时间:2014-05-14 04:33:18

标签: silverlight datagrid scroll virtualization

我有一个包含两列的Datagrid。第一列包含一个带有自定义控件的DataTemplate。我在Datagrid上设置了MaxHeight和VerticalScrollbarvisibility = Auto。当网格包含大约20行时,滚动条变为可见。在快速滚动时,底部或上部行中的数据未正确反映(可能由于虚拟化,它显示来自先前单元的数据)。所以我有几个问题 -

  1. 是否可以关闭虚拟化?我正在使用silverlight 5。
  2. 是否可以修复网格标题并将网格本身放在滚动查看器中,以便给出网格自己滚动条的印象。
  3. 非常感谢任何帮助。

    由于

1 个答案:

答案 0 :(得分:1)

是的,可以关闭虚拟化。

我遇到了与你完全相同的问题 - 这种自定义风格关闭了虚拟化并且像魅力一样:

   <Style x:Key="NonVirtualizingDataGridStyle" TargetType="sdk:DataGrid">
    <Setter Property="RowBackground" Value="#EBEBED" />
    <Setter Property="AlternatingRowBackground" Value="#EBEBED" />
    <Setter Property="RowHeight" Value="25" />
    <Setter Property="GridLinesVisibility" Value="All"/>
    <Setter Property="HeadersVisibility" Value="Column" />
    <Setter Property="HorizontalGridLinesBrush" Value="#A0A0A0" />
    <Setter Property="HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="VerticalScrollBarVisibility" Value="Auto" />
    <Setter Property="SelectionMode" Value="Single" />
    <Setter Property="CanUserReorderColumns" Value="False" />
    <Setter Property="CanUserResizeColumns" Value="False" />
    <Setter Property="CanUserSortColumns" Value="True" />
    <Setter Property="AutoGenerateColumns" Value="True" />
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="sdk:DataGrid">
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="Opacity" Duration="0" To="1" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="2">
                        <Grid x:Name="Root" Background="{TemplateBinding Background}">
                            <Grid.Resources>
                                <!--Start: TopLeftHeaderTemplate-->
                                <ControlTemplate x:Key="TopLeftHeaderTemplate" TargetType="sdk:DataGridColumnHeader">
                                    <Grid x:Name="Root">
                                        <Grid.RowDefinitions>
                                            <RowDefinition />
                                            <RowDefinition />
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
                                        <Border BorderThickness="0,0,1,0" BorderBrush="#FFC9CACA" Background="#FF1F3B53" Grid.RowSpan="2">
                                            <Rectangle Stretch="Fill" StrokeThickness="1">
                                                <Rectangle.Fill>
                                                    <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1">
                                                        <GradientStop Color="#FCFFFFFF" Offset="0.015" />
                                                        <GradientStop Color="#F7FFFFFF" Offset="0.375" />
                                                        <GradientStop Color="#E5FFFFFF" Offset="0.6" />
                                                        <GradientStop Color="#D1FFFFFF" Offset="1" />
                                                    </LinearGradientBrush>
                                                </Rectangle.Fill>
                                            </Rectangle>
                                        </Border>
                                        <Rectangle VerticalAlignment="Bottom" Width="Auto" StrokeThickness="1" Height="1" Fill="#FFDBDCDC" Grid.RowSpan="2" />
                                    </Grid>
                                </ControlTemplate>
                                <!--End: TopLeftHeaderTemplate-->

                                <!--Start: TopRightHeaderTemplate-->
                                <ControlTemplate x:Key="TopRightHeaderTemplate" TargetType="sdk:DataGridColumnHeader">
                                    <Grid x:Name="RootElement">
                                        <Grid.RowDefinitions>
                                            <RowDefinition />
                                            <RowDefinition />
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
                                        <Border BorderThickness="1,0,0,0" BorderBrush="#FFC9CACA" Background="#FF1F3B53" Grid.RowSpan="2">
                                            <Rectangle Stretch="Fill">
                                                <Rectangle.Fill>
                                                    <LinearGradientBrush StartPoint=".7,0" EndPoint=".7,1">
                                                        <GradientStop Color="#FCFFFFFF" Offset="0.015" />
                                                        <GradientStop Color="#F7FFFFFF" Offset="0.375" />
                                                        <GradientStop Color="#E5FFFFFF" Offset="0.6" />
                                                        <GradientStop Color="#D1FFFFFF" Offset="1" />
                                                    </LinearGradientBrush>
                                                </Rectangle.Fill>
                                            </Rectangle>
                                        </Border>
                                    </Grid>
                                </ControlTemplate>
                                <!--End: TopRightHeaderTemplate-->
                            </Grid.Resources>

                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto" />
                                <RowDefinition />
                                <RowDefinition Height="Auto" />
                                <RowDefinition Height="Auto" />
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>

                            <!-- Fill up the space in the header above the vertical scroll bar -->
                            <Grid Grid.Column="1">
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="0.5*" />
                                    <RowDefinition Height="0.5*" />
                                </Grid.RowDefinitions>
                                <!--<Rectangle x:Name="BackgroundGradient" Stretch="Fill" Fill="#FF79C1C0" Grid.RowSpan="2"/>
                                <Rectangle x:Name="BackgroundGradient_Copy" Fill="#6BFFFFFF" VerticalAlignment="Stretch" Grid.RowSpan="1"/>-->
                                <Rectangle x:Name="BackgroundGradient" Stretch="Fill" 
                        Fill="{StaticResource CustomRed}" Grid.ColumnSpan="2" 
                        Grid.RowSpan="2"  />
                                <Border BorderBrush="Transparent" 
                            BorderThickness="1,1,1,1" 
                            Grid.ColumnSpan="3" Grid.RowSpan="3">
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="0.5*"/>
                                            <RowDefinition Height="0.5*"/>
                                        </Grid.RowDefinitions>
                                        <!--dark-->
                                        <Border HorizontalAlignment="Stretch" 
                               Margin="0,0,0,0" x:Name="dark" 
                               Width="Auto" Grid.ColumnSpan="3" 
                               Grid.RowSpan="3" 
                               Background="#66000000" 
                               Opacity="0"/>
                                        <!--glow-->
                                        <Border Opacity="0"
                             HorizontalAlignment="Stretch" x:Name="glow" 
                             Width="Auto" Grid.RowSpan="2" 
                             Grid.ColumnSpan="3">
                                            <Border.Background>
                                                <RadialGradientBrush>
                                                    <RadialGradientBrush.RelativeTransform>
                                                        <TransformGroup>
                                                            <ScaleTransform ScaleX="1.7" 
                                                   ScaleY="2.2"/>
                                                            <SkewTransform AngleX="0" 
                                                   AngleY="0"/>
                                                            <RotateTransform Angle="0"/>
                                                            <TranslateTransform X="-0.3" 
                                                   Y="-0.1"/>
                                                        </TransformGroup>
                                                    </RadialGradientBrush.RelativeTransform>
                                                    <GradientStop Color="#B2FFFFFF" 
                                           Offset="0"/>
                                                    <GradientStop Color="#00FFFFFF" 
                                           Offset="1"/>
                                                </RadialGradientBrush>
                                            </Border.Background>
                                        </Border>
                                        <!--shine-->
                                        <Border HorizontalAlignment="Stretch" 
                                     Margin="0,0,0,0" x:Name="shine" 
                                     Width="Auto" 
                                     Grid.ColumnSpan="3">
                                            <Border.Background>
                                                <LinearGradientBrush EndPoint="0.5,0.9" 
                                            StartPoint="0.5,0.1">
                                                    <GradientStop Color="#99FFFFFF" 
                                            Offset="0"/>
                                                    <GradientStop Color="#33FFFFFF" 
                                            Offset="1"/>
                                                </LinearGradientBrush>
                                            </Border.Background>
                                        </Border>
                                    </Grid>
                                </Border>
                            </Grid>

                            <sdk:DataGridColumnHeader x:Name="TopLeftCornerHeader" Template="{StaticResource TopLeftHeaderTemplate}" Width="22" />
                            <sdk:DataGridColumnHeadersPresenter Grid.Column="1" x:Name="ColumnHeadersPresenter" HorizontalAlignment="Left"/>
                            <sdk:DataGridColumnHeader x:Name="TopRightCornerHeader" Grid.Column="2" Template="{StaticResource TopRightHeaderTemplate}" />
                            <Rectangle x:Name="ColumnHeadersAndRowsSeparator" Grid.ColumnSpan="3" VerticalAlignment="Bottom" Width="Auto" StrokeThickness="1" Height="1" Fill="#FFC9CACA"/>

                            <ScrollViewer Style="{StaticResource RowScrollViewerStyle}" Grid.ColumnSpan="2" Grid.Row="1" Padding="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled" >
                                <sdk:DataGridRowsPresenter x:Name="RowsPresenter" />
                            </ScrollViewer>
                            <Rectangle x:Name="BottomRightCorner" Fill="#FFE9EEF4" Grid.Column="2" Grid.Row="2" />
                            <Rectangle x:Name="BottomLeftCorner" Fill="#FFE9EEF4" Grid.Row="2" Grid.ColumnSpan="2" />
                            <Grid Grid.Column="1" Grid.Row="2">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto" />
                                    <ColumnDefinition />
                                </Grid.ColumnDefinitions>
                                <Rectangle x:Name="FrozenColumnScrollBarSpacer" />
                                <!--<local:Navigator Margin="4,0,2,0" />-->
                                <ScrollBar x:Name="HorizontalScrollbar" Grid.Column="1" Orientation="Horizontal" Height="18" Margin="-1,0,-1,-1" />
                            </Grid>
                        </Grid>
                    </Border>
                    <Border x:Name="DisabledVisualElement" IsHitTestVisible="False" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" CornerRadius="2" Background="#8CFFFFFF" Opacity="0"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

有一种更简单的方式用于关闭虚拟化,但上面的方式有修改以冻结网格标题。我刚刚抛弃了我使用的样式,你可能想要删除样式 - 但功能就在那里。

这种风格将解决你的2分。