Как убрать из DataGrid ColumnHeader прокрутку?
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="85*"/>
<ColumnDefinition Width="287*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid x:Name="LabelGrid" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="0" Background="#FFF8F7F2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="19*"/>
<ColumnDefinition Width="725*"/>
</Grid.ColumnDefinitions>
...
<Grid x:Name="MonthReport" IsEnabled="True" Visibility="Visible" HorizontalAlignment="Stretch" Grid.Column=" 1" Grid.ColumnSpan="2" Grid.Row="1" Background="#FFE5E5E5">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="40"/>
<RowDefinition Height="70"/>
<RowDefinition/>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="40"/>
<ColumnDefinition/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<Label Content="Укажите нужный месяц и год" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Left" TextBlock.FontFamily="PT Sans" TextBlock.FontWeight="DemiBold" Margin="0,6.4"/>
<Grid Grid.Column="1" Grid.Row="1" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="195*"/>
<ColumnDefinition Width="32"/>
<ColumnDefinition Width="195*"/>
<ColumnDefinition Width="16"/>
<ColumnDefinition Width="107*"/>
<ColumnDefinition Width="45*"/>
<ColumnDefinition Width="65*"/>
</Grid.ColumnDefinitions>
<ComboBox x:Name="ComboBoxMonth" Grid.Column="0" Width="Auto" IsEditable="True" TextBlock.FontFamily="PT Sans" TextBlock.Foreground="Black" VerticalContentAlignment="Center" Text="Месяц" SelectionChanged="ComboboxSelected" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FFFFFFFF" Padding="16,6,0,6" />
<ComboBox x:Name="ComboBoxYears" Grid.Column="2" IsEditable="True" TextBlock.FontFamily="PT Sans" TextBlock.Foreground="Black" VerticalContentAlignment="Center" Text="Год" SelectionChanged="ComboboxSelected" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FFFFFFFF" Padding="16,6,0,6" />
<Button x:Name="GetMonthReportButton" Height="Auto" Click="GetMonthReportButtonClick" IsEnabled="False" Content="Посчитать" TextBlock.FontFamily="PT Sans" Grid.Column="4" Background="#FF5C3C86" BorderBrush="#FF5C3C86" Padding="14,4"/>
<Button x:Name="SaveMonthReportButton" Height="Auto" Click="SaveMonthReportButtonClick" IsEnabled="False" Grid.Column="6" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FF5C3C86" BorderBrush="#FF5C3C86">
<Image Source="Resources/SaveIcon.png"/>
</Button>
</Grid>
<DataGrid x:Name="MonthReportMeetDataGrid" CanUserReorderColumns="False" HorizontalGridLinesBrush="#FFE5E5E5" Background="White" Grid.Column="1" Grid.Row="3" RowEditEnding="MonthReportMeetDataGrid_RowEditEnding" AutoGenerateColumns="False" >
<DataGrid.Columns>
<DataGridTextColumn Header="Тип возвещателя" TextBlock.TextAlignment="Left" CanUserSort="False" CanUserResize="False" IsReadOnly="True" Binding="{Binding Type}" Width="2*">
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Сдало" TextBlock.FontSize="14" CanUserSort="False" CanUserResize="False" IsReadOnly="False" Binding="{Binding CountReports, UpdateSourceTrigger=PropertyChanged}" Width="*" >
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Width="*" Header="Публ." CanUserSort="False" TextBlock.FontSize="14" CanUserResize="False" IsReadOnly="False" Binding="{Binding Publications}" >
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Width="*" Header="Видео" CanUserSort="False" TextBlock.FontSize="14" CanUserResize="False" IsReadOnly="False" Binding="{Binding Videos}" >
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Width="*" Header="Часы" CanUserSort="False" TextBlock.FontSize="14" IsReadOnly="False" Binding="{Binding Hours}" >
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Width="*" Header="Повт. п." CanUserResize="False" TextBlock.FontSize="14" CanUserSort="False" IsReadOnly="False" Binding="{Binding ReturnVisits}">
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
<DataGridTextColumn Width="*" Header="Изучения" CanUserSort="False" TextBlock.FontSize="14" CanUserResize="False" IsReadOnly="False" Binding="{Binding BibleStudy}" >
<DataGridTextColumn.HeaderStyle>
<Style>
<Setter Property="ToolBar.Background" Value="#FFE5E5E5"/>
<Setter Property="TextBlock.FontSize" Value="15"/>
<Setter Property="TextBlock.TextAlignment" Value="Left"/>
<Setter Property="TextBlock.FontFamily" Value="PT Sans"/>
</Style>
</DataGridTextColumn.HeaderStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
...
</Grid>```
Ответы (1 шт):
В принципе, указанная проблема решается следующим образом.
Если нужно просто убрать белый прямоугольник, то достаточно задать DataGrid.Background тем же цветом, который используется для фона колонок вместо White. Это свойство отвечает не за цвет ячеек, а за цвет пустого места в гриде, включая то, которое образуется при работе полос прокрутки.
Если нужно именно сделать так, чтобы вертикальная полоса прокрутки выглядела как в Windows Forms, то проще всего это можно сделать с использованием отрицательного значения верхней границы у полосы прокрутки. У меня корректно отработал следующий код:
<Style TargetType="DataGrid">
<Style.Resources>
<local:GridConverter x:Key="gridConverter"/>
<Style TargetType="ScrollBar">
<Style.Triggers>
<Trigger Property="Orientation" Value="Vertical">
<Setter Property="Margin"
Value="{Binding RelativeSource=
{RelativeSource FindAncestor,
AncestorLevel=1,
AncestorType={x:Type DataGrid}},
Converter={StaticResource gridConverter}}"/>
</Trigger>
</Style.Triggers>
</Style>
</Style.Resources>
</Style>
Для таблиц я сделал стиль по умолчанию, внутри которого находится стиль для полосы прокрутки. В этом стиле находится триггер, который для вертикальной полосы прокрутки устанавливает толщину верхней границы, равную высоте заголовков колонок.
Высота заголовков колонок в гриде вычисляется с использованием специального конвертера, который я назвал GridConverter и поместил его экземпляр в ресурсы стиля. Он конвертирует таблицу DataGrid в значение типа Thickness, которое нужно присвоить толщине границ вертикальной полосы прокрутки. Код класса GridConverter получился такой:
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (targetType == typeof(Thickness))
{
if (value is DataGrid)
{
var grid = (DataGrid)value;
var presenter = FindVisualChild<DataGridColumnHeadersPresenter>(grid);
return new Thickness(0, - presenter.ActualHeight, 0, 0);
}
else
return new Thickness();
}
return null;
}
public static T FindVisualChild<T>(DependencyObject current) where T : DependencyObject
{
if (current == null)
return null;
int childrenCount = VisualTreeHelper.GetChildrenCount(current);
for (int i = 0; i < childrenCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(current, i);
if (child is T)
return (T)child;
T result = FindVisualChild<T>(child);
if (result != null)
return result;
}
return null;
}
Этот конвертер в визуальном дереве таблицы рекурсивно ищет шаблон заголовков колонок, берёт его актуальную высоту и возвращает нужную толщину границ, опираясь на эту актуальную высоту.
