2014-05-14 1 views
1

두 개의 열이있는 Datagrid가 있습니다. 첫 번째 열에는 사용자 정의 컨트롤이있는 DataTemplate이 있습니다. Datagrid에서 MaxHeight 및 VerticalScrollbarvisibility = Auto를 설정했습니다. 그리드에 약 20 개의 행이 있으면 스크롤 막대가 표시됩니다. 빠르게 스크롤하면 하단 또는 상단 행의 데이터가 제대로 반영되지 않습니다 (가상화로 인해 이전 셀의 데이터가 표시 될 수 있음). 그래서 몇 가지 질문이 있습니다 -Silverlight datagrid 가상화로 스크롤 할 때 문제가 발생합니다.

  1. 가상화를 해제 할 수 있습니까? 실버 라이트 5를 사용하고 있습니다.
  2. 그리드 헤더를 수정하고 그리드 자체를 스크롤 뷰어에 놓아서 그리드 자체의 스크롤 막대의 느낌을 줄 수 있습니까?

도움을 주시면 대단히 감사하겠습니다.

감사합니다.

답변

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 점을 해결합니다.

+0

감사합니다 DNKROZ .. 나는 이것을 정확히 구현했습니다. – Atin

+0

문제 없으므로 기쁘다. – DNKROZ

관련 문제