C# wpf - цвет фона вне datagrid

Я новичок в WPF, и я пытаюсь создать DataGrid с автоматически сгенерированными столбцами. Теперь я стилизовал DataGrid так, как хочу, но возникает проблема, когда DG меньше, чем ParentContent, и это выглядит так.

enter image description here

Мне не нравится, как выглядит эта белая полоса на правой стороне DG, но я не знаю, как изменить ее цвет. Я хочу, чтобы это выглядело как в DataGridView.

enter image description here

У меня вопрос: как изменить цвет этой части сетки?

СЕТЕВОЙ КОД

<DataGrid x:Class="Project.WPF.Grid"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Project.WPF"
      mc:Ignorable="d" 
      d:DesignHeight="50" d:DesignWidth="200"
      Name="dgv_grid"
      Height="Auto" Width="Auto"
      AutoGenerateColumns="True" 
      SelectionMode="Single"
      ItemsSource="{Binding}" 
      DataContext="{Binding}"
      Background="#ABABAB" 
      SelectionUnit="FullRow"
      CanUserAddRows="False"
      CanUserReorderColumns="False"
      CanUserResizeColumns="True"
      CanUserResizeRows="False"
      IsReadOnly="True"
      GridLinesVisibility="None"
      HorizontalGridLinesBrush="#A0A0A0"
      VerticalGridLinesBrush="#A0A0A0"
      BorderThickness="1"
      BorderBrush="#636363"
      EnableColumnVirtualization="True"
      RowHeaderWidth="0"
      ColumnWidth="Auto"
      Loaded="dgv_grid_Loaded" 
      AutoGeneratedColumns="dgv_grid_AutoGeneratedColumns"
      AutoGeneratingColumn="dgv_grid_AutoGeneratingColumn"
      MouseDoubleClick="dgv_grid_MouseDoubleClick"
      SelectedCellsChanged="dgv_grid_SelectedCellsChanged">

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <!--#region Triggers-->
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="#A0A0A0"/>
                <Setter Property="BorderThickness" Value="1,1,1,1"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="BorderBrush" Value="#A0A0A0"/>
                <Setter Property="BorderThickness" Value="1,1,1,1"/>
                <Setter Property="Background" Value="#FFB6B6B6"/>
            </Trigger>
        </Style.Triggers>
        <!--#endregion-->
        <!--#region Setters-->
        <!--<Setter Property="Height" Value="Auto"/>-->
        <Setter Property="FontFamily" Value="Myanmar Text"/>
        <Setter Property="FontSize" Value="12"/>
        <Setter Property="FontWeight" Value="SemiBold"/>
        <Setter Property="Background" Value="#ffffff"/>
        <Setter Property="BorderThickness" Value="1,1,0,1"/>
        <Setter Property="Padding" Value="7,5,5,0"/>
        <Setter Property="BorderBrush" Value="#e5e5e5"/>
        <Setter Property="TextBlock.TextAlignment" Value="Left"/>
        <Setter Property="VerticalAlignment" Value="Stretch"/>
        <Setter Property="TextBlock.TextWrapping" Value="WrapWithOverflow"/>
        <!--#endregion-->
    </Style>
</DataGrid.ColumnHeaderStyle>

<DataGrid.RowHeaderStyle>
    <Style TargetType="{x:Type DataGridRowHeader}">

        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="#A0A0A0"/>
                <Setter Property="BorderThickness" Value="1,1,1,1"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="BorderBrush" Value="#A0A0A0"/>
                <Setter Property="BorderThickness" Value="1,1,1,1"/>
                <Setter Property="Background" Value="#FFB6B6B6"/>
            </Trigger>
        </Style.Triggers>

        <Setter Property="Background" Value="#ffffff"/>
        <Setter Property="BorderBrush" Value="#e5e5e5"/>
        <Setter Property="BorderThickness" Value="1,1,1,0"/>
        <Setter Property="Width" Value="33"/>
        <Setter Property="Height" Value="20"/>
    </Style>
</DataGrid.RowHeaderStyle>

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}">
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="#FF7B7E99"/>
                <Setter Property="BorderThickness" Value="0"/>
            </Trigger>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="Background" Value="#FF4DA2D8"/>
                <Setter Property="BorderThickness" Value="0"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="#ABABAB"/>
            </Trigger>
        </Style.Triggers>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Grid Background="{TemplateBinding Background}">
                        <Border BorderBrush="#a0a0a0" BorderThickness="1,1,0,0"/>
                        <ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" Margin="6,2,6,2"/>
                        <ContentControl FontFamily="Myanmar Text" FontSize="20"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.CellStyle>

1
0
221
2

Ответы 2

Если вы читаете ControlTemplate MSDN для DataGrid:

Стили и шаблоны DataGrid

Вы увидите большое количество кодов. Не знаю, знакомы ли вы с ControlTemplates или нет. но за этими кодами есть ColumnDefinition в ScrollViewer: (Я имею в виду MSDN)

<ScrollViewer x:Name="DG_ScrollViewer" Focusable="false" Background="Black">
     <ScrollViewer.Template>
            <ControlTemplate TargetType="{x:Type ScrollViewer}">
                 <Grid>
                     <Grid.ColumnDefinitions>
                     <ColumnDefinition Width="Auto" />
                     <ColumnDefinition Width="*" />
                     <ColumnDefinition Width="Auto" />

Вы можете видеть, что это определение заполнит родительский контейнер. потому что ширина среднего столбца равна *, и он заполнит весь родительский элемент.

Я не знаю, как можно избавиться от этого столбца в настройках WPF по умолчанию. но если у вас есть время, чтобы стилизовать свой DataGrid. вы можете изменить ControlTemplate MSDN и удалить эту строку:

 <ColumnDefinition Width="*" />

так что вы получите то, что дает вам DataGridView.

Я действительно не понимаю, что план кода написан в ссылке, но как удаление строки columndefinition повлияет на мое приложение, потому что, если я хорошо понимаю, вы говорите, что я должен обновить исходный код шаблона WPF DataGrid.

Bruno Ramirez 19.05.2019 05:22

Если вы не хотите, чтобы DataGrid растягивался по горизонтали, вы можете установить для его свойства HorizontalAlignment значение Left:

<DataGrid x:Class="Project.WPF.Grid" ... HorizontalAlignment="Left" />

Если вы хотите изменить фон пустой части, вы можете поместить DataGrid в Grid и установить свойство Background для этого: ´

<Grid Background="Gray">
    <DataGrid ... HorizontalAlignment="Left" />
</Grid>

Я попробовал первый, но он не дает того эффекта, который дает DGV. Что касается второго, это может быть хорошим решением, но это размещенный элемент управления в приложении Winforms, и у меня есть строки, написанные в классе, например public class CustomGrid : DataGrid, переписанный весь код - это не то, что я хочу сейчас, поэтому я не утончаю этот элемент управления в сетке - вот решение :(

Bruno Ramirez 19.05.2019 05:17

Другие вопросы по теме