c# - 列标题与 Wpf Datagrid 中数据的偏移

标签 c# wpf wpfdatagrid

早上好

我有一个 Wpf 数据网格,它显示自定义类型的可观察集合

我使用 XAML 中的 Collection View 源将数据分组到两个单独的属性上,并将这些组设置为显示为扩展器的样式。

为了清楚起见,由于有很多数据,我觉得我必须使用边距和间距,否则事情看起来非常困惑。

我的问题是,使用两级分层扩展器时,列数据现在与列标题有很大的偏移,这意味着它们没有正确对齐。

我尝试了几件事,例如设置列标题的边距和宽度(实际宽度和正常宽度)。然而,我所有的尝试最终都会调整整个列的大小,以便偏移量保持不变,但列会移动。

所以我的问题:

如何更改列标题的可见宽度或偏移量以确保标题与数据对齐

  • Visual Studio 2012
  • Wpf
  • C#
  • 数据网格

编辑这就是我的意思

Offset Columns

编辑 2 - 用于分组的我的 Xaml

<!--  Style for groups at top level.  -->
<GroupStyle>
    <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">
            <Setter Property="Margin" Value="0" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <Expander Margin="5,10,5,5"
                                  BorderBrush="{StaticResource BlackBrush}"
                                  BorderThickness="1"
                                  Header="{Binding Name}"
                                  IsExpanded="True">

                            <Expander.Template>
                                <!--  The basic expander  -->
                                <ControlTemplate TargetType="{x:Type Expander}">
                                    <!--  Put a border around the expander  -->
                                    <Border Background="{Binding Path=Name,
                                                                 Converter={StaticResource ColourConverter}}"
                                            BorderBrush="{StaticResource GreyBrush}"
                                            BorderThickness="2"
                                            CornerRadius="3">

                                        <!--  Use a dock panel so that the toggle button is docked to the top and the content is docked to the bottom  -->
                                        <DockPanel Margin="0">

                                            <!--  Add the toggle button  -->
                                            <ToggleButton x:Name="ExpanderButton"
                                                          Margin="0"
                                                          Content="{TemplateBinding Header}"
                                                          DockPanel.Dock="Top"
                                                          FontSize="14"
                                                          FontWeight="Bold"
                                                          Foreground="{StaticResource BlackBrush}"
                                                          IsChecked="{Binding Path=IsExpanded,
                                                                              RelativeSource={RelativeSource TemplatedParent}}"
                                                          OverridesDefaultStyle="True"
                                                          Template="{StaticResource AnimatedExpanderButton}" />

                                            <ContentPresenter x:Name="ExpanderContent"
                                                              Margin="5"
                                                              ContentSource="Content"
                                                              DockPanel.Dock="Bottom"
                                                              Visibility="{Binding ElementName=ExpanderButton,
                                                                                   Path=IsChecked,
                                                                                   Converter={StaticResource VisibilityConverter}}" />
                                        </DockPanel>
                                    </Border>
                                </ControlTemplate>
                            </Expander.Template>
                            <ItemsPresenter />
                        </Expander>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </GroupStyle.ContainerStyle>
</GroupStyle>

<!--  Style for groups under the top level.  -->
<GroupStyle>
    <GroupStyle.ContainerStyle>
        <Style TargetType="{x:Type GroupItem}">

            <Setter Property="Margin" Value="0,0,0,5" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <Expander Margin="5"
                                  Background="{Binding Path=Name,
                                                       Converter={StaticResource ColourConverter}}"
                                  IsExpanded="True"
                                  Visibility="{Binding Items[0].IsSelectedInSidebar,
                                                       Converter={StaticResource VisibilityConverter}}">

                            <Expander.Template>
                                <!--  The basic expander  -->
                                <ControlTemplate TargetType="{x:Type Expander}">
                                    <!--  Put a border around the expander  -->
                                    <Border Background="{Binding Path=Name,
                                                                 Converter={StaticResource ColourConverter}}"
                                            BorderBrush="{StaticResource GreyBrush}"
                                            BorderThickness="2"
                                            CornerRadius="3">

                                        <!--  Use a dock panel so that the toggle button is docked to the top and the content is docked to the bottom  -->
                                        <DockPanel Margin="0">

                                            <!--  Add the toggle button  -->
                                            <ToggleButton x:Name="ExpanderButton"
                                                          Content="{Binding Path=Name}"
                                                          DockPanel.Dock="Top"
                                                          FontSize="12"
                                                          IsChecked="{Binding Path=IsExpanded,
                                                                              RelativeSource={RelativeSource TemplatedParent}}"
                                                          OverridesDefaultStyle="True"
                                                          Template="{StaticResource AnimatedExpanderButton}" />

                                            <ContentPresenter x:Name="ExpanderContent"
                                                              Margin="5"
                                                              ContentSource="Content"
                                                              DockPanel.Dock="Bottom"
                                                              Visibility="{Binding ElementName=ExpanderButton,
                                                                                   Path=IsChecked,
                                                                                   Converter={StaticResource VisibilityConverter}}" />
                                        </DockPanel>
                                    </Border>
                                </ControlTemplate>
                            </Expander.Template>
                            <Expander.Content>
                                <Border BorderBrush="{StaticResource BlackBrush}" BorderThickness="1">
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="*" />
                                            <RowDefinition Height="Auto" />
                                        </Grid.RowDefinitions>
                                        <ItemsPresenter Grid.Row="0" Margin="0" />

                                        <Border Grid.Row="1"
                                                Margin="0,10,0,0"
                                                BorderBrush="{StaticResource BlackBrush}"
                                                BorderThickness="0,1,0,0"
                                                Visibility="{Binding Data.SettingRepository.MainDataSummaryVisible,
                                                                     Source={StaticResource BindingProxy},
                                                                     Converter={StaticResource VisibilityConverter}}">
                                            <Grid Background="{StaticResource WhiteBrush}">
                                                <Grid.RowDefinitions>
                                                    <RowDefinition Height="Auto" />
                                                    <RowDefinition Height="Auto" />
                                                    <RowDefinition Height="Auto" />
                                                </Grid.RowDefinitions>

                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="Auto" />
                                                    <ColumnDefinition Width="Auto" />
                                                    <ColumnDefinition Width="Auto" />
                                                    <ColumnDefinition Width="Auto" />
                                                    <ColumnDefinition Width="Auto" />
                                                    <ColumnDefinition Width="Auto" />
                                                </Grid.ColumnDefinitions>

                                                <Grid Grid.Row="0" Grid.ColumnSpan="6">
                                                    <Grid.ColumnDefinitions>
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                        <ColumnDefinition Width="Auto" />
                                                    </Grid.ColumnDefinitions>

                                                    <TextBlock Grid.Column="0"
                                                               Margin="5"
                                                               FontWeight="Bold"
                                                               Text="{Binding Path=Items[0].Option1Title}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />
                                                    <TextBlock Grid.Column="1"
                                                               Margin="5"
                                                               Text="{Binding Path=Items[0].Option1Data,
                                                                              Mode=OneWay}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />

                                                    <TextBlock Grid.Column="2"
                                                               Margin="5"
                                                               FontWeight="Bold"
                                                               Text="{Binding Path=Items[0].Option2Title}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />
                                                    <TextBlock Grid.Column="3"
                                                               Margin="5"
                                                               Text="{Binding Path=Items[0].Option2Data,
                                                                              Mode=OneWay}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />
                                                    <TextBlock Grid.Column="4"
                                                               Margin="5"
                                                               FontWeight="Bold"
                                                               Text="{Binding Path=Items[0].Option3Title}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />
                                                    <TextBlock Grid.Column="5"
                                                               Margin="5"
                                                               Text="{Binding Path=Items[0].Option3Data,
                                                                              Mode=OneWay}" />
                                                    <TextBlock Grid.Column="6"
                                                               Margin="5"
                                                               FontWeight="Bold"
                                                               Text="{Binding Path=Items[0].Option4Title}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />
                                                    <TextBlock Grid.Column="7"
                                                               Margin="5"
                                                               Text="{Binding Path=Items[0].Option4Data,
                                                                              Mode=OneWay}"
                                                               Visibility="{Binding Data.SettingRepository.MainDataShowSampleOptions,
                                                                                    Source={StaticResource BindingProxy},
                                                                                    Converter={StaticResource VisibilityConverter}}" />

                                                    <TextBlock Grid.Column="8"
                                                               Margin="5"
                                                               FontWeight="Bold"
                                                               Text="{x:Static languages:Strings.SampleIsAnnealedColumnHeader}" />
                                                    <CheckBox Grid.Column="9"
                                                              Margin="3,5,5,5"
                                                              IsChecked="{Binding Path=Items[0].SampleIsAnnealed,
                                                                                  Mode=OneWay}"
                                                              IsHitTestVisible="False"
                                                              Style="{StaticResource FandFCheckBox}" />
                                                </Grid>

                                                <!--  The mean Match temperature  -->
                                                <TextBlock Grid.Row="1"
                                                           Grid.Column="0"
                                                           Margin="5"
                                                           FontWeight="Bold"
                                                           Text="{x:Static languages:Strings.MeanSampleMatchTemperatureTitle}" />
                                                <TextBlock Grid.Row="1"
                                                           Grid.Column="1"
                                                           Margin="5"
                                                           Text="{Binding Path=Items[0].SampleMeanMatchTemperature,
                                                                          Mode=OneWay,
                                                                          StringFormat=\{0:N2\}}" />

                                                <!--  The match temperature range  -->
                                                <TextBlock Grid.Row="1"
                                                           Grid.Column="2"
                                                           Margin="5"
                                                           FontWeight="Bold"
                                                           Text="{x:Static languages:Strings.SampleTemperatureRangeTitle}" />
                                                <TextBlock Grid.Row="1"
                                                           Grid.Column="3"
                                                           Margin="5"
                                                           Text="{Binding Path=Items[0].SampleMatchTemperatureRange}" />

                                                <!--  The match temperature standard deviation  -->
                                                <TextBlock Grid.Row="1"
                                                           Grid.Column="4"
                                                           Margin="5"
                                                           FontWeight="Bold"
                                                           Text="{x:Static languages:Strings.SampleTemperatureStandardDeviationTitle}" />
                                                <TextBlock Grid.Row="1"
                                                           Grid.Column="5"
                                                           Margin="5"
                                                           Text="{Binding Path=Items[0].SampleMatchTemperatureStandardDeviation,
                                                                          Mode=OneWay,
                                                                          StringFormat=\{0:N3\}}" />

                                                <!--  The mean refractive index  -->
                                                <TextBlock Grid.Row="2"
                                                           Grid.Column="0"
                                                           Margin="5"
                                                           FontWeight="Bold"
                                                           Text="{x:Static languages:Strings.SampleMeanRefractiveIndexTitle}" />
                                                <TextBlock Grid.Row="2"
                                                           Grid.Column="1"
                                                           Margin="5"
                                                           Text="{Binding Path=Items[0].SampleMeanRefractiveIndex,
                                                                          Mode=OneWay,
                                                                          StringFormat=\{0:N5\}}" />

                                                <!--  The refractive index range  -->
                                                <TextBlock Grid.Row="2"
                                                           Grid.Column="2"
                                                           Margin="5"
                                                           FontWeight="Bold"
                                                           Text="{x:Static languages:Strings.SampleRIRangeTitle}" />
                                                <TextBlock Grid.Row="2"
                                                           Grid.Column="3"
                                                           Margin="5"
                                                           Text="{Binding Path=Items[0].SampleRefractiveIndexRange}" />

                                                <!--  The refractive index standard deviation  -->
                                                <TextBlock Grid.Row="2"
                                                           Grid.Column="4"
                                                           Margin="5"
                                                           FontWeight="Bold"
                                                           Text="{x:Static languages:Strings.SampleRIStandardDeviationTitle}" />
                                                <TextBlock Grid.Row="2"
                                                           Grid.Column="5"
                                                           Margin="5"
                                                           Text="{Binding Path=Items[0].SampleRefractiveIndexStandardDeviation,
                                                                          Mode=OneWay,
                                                                          StringFormat=\{0:N7\}}" />
                                            </Grid>
                                        </Border>
                                    </Grid>
                                </Border>
                            </Expander.Content>
                        </Expander>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </GroupStyle.ContainerStyle>
</GroupStyle>

最佳答案

您可以设置ColumnHeaderStyle,并设置将标题移至右侧的RenderTransform

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="DataGridColumnHeader">
        <Setter Property="RenderTransform">
            <Setter.Value>
                //change the X value accordingly
                <TranslateTransform X="100"></TranslateTransform>
            </Setter.Value>
        </Setter>
    </Style>
</DataGrid.ColumnHeaderStyle>

编辑2:

正如您所提到的,这样做会导致一个小差距。要删除它,您应该将第一列的左边距设置为负值,这会将该列的标题向左拉伸(stretch)。你可以这样做:

<DataGridTemplateColumn.HeaderStyle>
    <Style TargetType="DataGridColumnHeader">
        //change the margin accordingly
        <Setter Property="Margin" Value="-100 0 0 0" />
        <Setter Property="RenderTransform">
            <Setter.Value>
                //change the X value accordingly
                <TranslateTransform X="100"></TranslateTransform>
            </Setter.Value>
        </Setter>
    </Style>
</DataGridTemplateColumn.HeaderStyle>

你必须在这里再次设置RenderTransform,因为这个样式会覆盖一般的ColumnHeaderStyle。要删除重复,您可以将渲染转换添加为资源。

编辑:

我刚刚看到您的 ExpandersContentPresenters 上有一些边距。如果您更改它们以使左侧边距为 0,则内容会更靠左对齐并减少对齐差异。

然后,您将需要更少的 RenderTransform 偏移量。

一些代码示例来说明我的意思:

<Expander Margin="5,10,5,5"
<ContentPresenter x:Name="ExpanderContent" Margin="5"

如果你把它改成

<Expander Margin="0,10,5,5"
<ContentPresenter x:Name="ExpanderContent" Margin="0 5 5 5"

列向左移动得更多。

关于c# - 列标题与 Wpf Datagrid 中数据的偏移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29964257/

相关文章:

c# - 如何在 C# 中转换以下内容?

c# - 如何根据对照查找表检查的 url 调用 ASP.Net MVC?

wpf - MVVM ICommand 替代方案

c# - 在分页符上将 WPF TableRow 元素保持在一起

c# - 如何设置自定义 DataGrid 非事件选择颜色?

c# - 查找自定义类型列表的最大数量

c# - c# 中的 Equals 是按引用还是按值进行比较?

wpf - 如何在 WPF 中为 listviewitem 设置边框

具有系统自定义短日期格式的 WPF 数据网格日期列

.net - 在 WPF MVVM 中绑定(bind)到没有代理对象的派生属性