0

我正在尋找一種'簡單'的方法來爲DataGrid ScrollBar做一個控件模板。我需要一個控制模板的DataGrid的唯一部分是水平滾動條,即。 PART_Horizo​​ntalScrollBar。有沒有這樣的事情,我可以添加到我的風格資源?ControlTemplate DataGrid ScrollBar

<Setter Property="Template"> 
<Setter.Value > 
<ControlTemplate x:Name= "PART_HorizontalScrollBar" > 
<DockPanel> etc... ... 

問題是,當我添加controltemplate時,列標題消失。如果我刪除了控件模板,則列標題會重新出現,但不會顯示水平滾動條。感謝您的建議。

回答

1

覆蓋爲DataGrid整個模板和設置PART_HorizontalScrollBarTemplate屬性自定義模板:

<DataGrid ...> 
    <DataGrid.Resources> 
     <ControlTemplate x:Key="yourCustomTemplate" /> 
    </DataGrid.Resources> 
    <DataGrid.Template> 
     <ControlTemplate TargetType="{x:Type DataGrid}"> 
      <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}"/> 
           <Grid Grid.Column="1" Grid.Row="2"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
             <ColumnDefinition Width="*"/> 
            </Grid.ColumnDefinitions> 
            <ScrollBar x:Name="PART_HorizontalScrollBar" 
                 Grid.Column="1" 
                 Maximum="{TemplateBinding ScrollableWidth}" 
                 Orientation="Horizontal" 
                 Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" 
                 Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                 ViewportSize="{TemplateBinding ViewportWidth}" 
                 Template="{StaticResource yourCustomTemplate}"/> 
           </Grid> 
          </Grid> 
         </ControlTemplate> 
        </ScrollViewer.Template> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </ScrollViewer> 
      </Border> 
     </ControlTemplate> 
    </DataGrid.Template> 
</DataGrid> 

可惜你不能只覆蓋一個ControlTemplate的一部分:

WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?

+0

那麼我在哪裏可以找到完整的默認DataGrid模板? – harpagornis

+0

我把它發佈在我的答案:) – mm8

+0

我沒有看到SO鏈接討論了DataGrid的控件模板。此鏈接顯示DataGrid只有一個PART。 https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/datagrid-styles-and-templates#datagrid-parts – harpagornis