繁体   English   中英

Wpf Datagrid中数据的列标题偏移

[英]Column Headers Offset From Data in Wpf Datagrid

早上好

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

我使用XAML中的集合视图源在两个单独的属性上对数据进行分组,并设置了样式以显示为扩展器。

为了清楚起见,由于有很多数据,我觉得我必须使用边距和间距,否则情况看起来很混乱。

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

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

所以我的问题是:

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

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

编辑这是我的意思

偏移列

编辑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:

如您所述,这样做会导致很小的差距。 要删除它,您应该将第一列的左边距设置为负值,这会将此列的标题向左扩展。 您可以这样做:

<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 要删除重复项,您可以将渲染Transfrom添加为资源。

编辑:

我刚刚看到您在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"

列向左移动更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM