【问题标题】:XAML/WPF Specific Distance Between ColumnsXAML/WPF 特定列之间的距离
【发布时间】:2017-09-25 04:37:36
【问题描述】:

这是我的数据网格,我如何确定列之间的距离相同,以便列标题不会像第二列或第三列那样啄...

XAML:

<Style x:Key="Datag1" TargetType="DataGrid">
            <Setter Property="ColumnHeaderStyle" Value="{DynamicResource chs1}"></Setter>
        </Style>
        <Style x:Key="chs1" TargetType="DataGridColumnHeader">
            <Setter Property="Background" Value="Brown"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontSize" Value="15"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Background" Value="LightGray"></Setter>
                </Trigger>
            </Style.Triggers>

        </Style>


<DataGrid Name="DataGridView" Style="{DynamicResource Datag1}" Margin="0,105,0,0"  FontSize="15" CanUserSortColumns="True"
                      Background="Azure" RowBackground="Aqua" AlternatingRowBackground="DarkGray" ColumnHeaderHeight="45" Foreground="Brown"
                      CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="True" CanUserReorderColumns="False" BorderBrush="Black">

            </DataGrid>

编辑:

最佳解决方案:“您最好将 DataGrid 的 AutoGenerateColumns 属性设置为 false,并明确定义每一列,并在 XAML 标记中为每一列设置单独的宽度。请参阅我编辑的答案以获取示例。” – mm8

非常感谢大家!

【问题讨论】:

  • 您好,先生,我默认设置它,在列宽属性中我得到了 SizeToHeader,但我想要的是例如在每个“标题”之后都有一段距离
  • 所以您希望能够为每一列指定明确的宽度或增加宽度?
  • 你好 mm8,让我们这么说吧:ColumnWidth = SizeToHeader + 1 英寸,这样每列在最大拟合后都有 1 英寸
  • 如果你看我的图片,第一栏看起来不错,但如果你看第二和第三栏它们互相啄,我想要的是适合栏目内容,但也不要削减标题太大了
  • 您是否尝试按照我的建议处理 dg_AutoGeneratedColumns 事件?

标签: wpf xaml


【解决方案1】:

您可以处理AutoGeneratingColumn 事件并为列指定您想要的任何Width

const double fixedWidth = 100;
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    e.Column.Width = new DataGridLength(fixedWidth);
}

如果您想为每列的宽度添加特定的偏移量,您可以处理 AutoGeneratedColumns 事件:

private void dg_AutoGeneratedColumns(object sender, EventArgs e)
{
    DataGrid dg = sender as DataGrid;
    foreach (var column in dg.Columns)
    {
        column.Width = column.ActualWidth + 10;
    }
}

如果您不想为每一列添加偏移量,最好将 DataGridAutoGenerateColumns 属性设置为 false 并明确定义每一列并在 XAML 标记中为每一列设置单独的宽度:

<DataGrid Name="DataGridView" Style="{DynamicResource Datag1}" Margin="0,105,0,0"  FontSize="15" CanUserSortColumns="True"
                      Background="Azure" RowBackground="Aqua" AlternatingRowBackground="DarkGray" ColumnHeaderHeight="45" Foreground="Brown"
                      CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="True" CanUserReorderColumns="False" BorderBrush="Black"
                    AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="slpos" Binding="{Binding slpos}" Width="20" />
        <!-- and so on for each column...-->
    </DataGrid.Columns>
</DataGrid>

【讨论】:

  • AutoGeneratedColumns 事件似乎是解决方案,但它应该首先适合列 sizetoheader,然后与 10 相加,现在看起来都一样
  • 对不起,如果我的解释令人困惑
【解决方案2】:

您的列看起来像这样,因为它们只占用必要的空间0 边距。因此,您需要做的就是在 DataGridColumnHeader 的样式中设置一个新模板,更改 ContentPresenter 的边距以满足您的需要(我将其设置为 10,2,但您可以测试不同的值以查看它的外观喜欢)。

试试下面的代码:

<Style x:Key="chs1" TargetType="DataGridColumnHeader">
    <Setter Property="Background" Value="Brown"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="FontSize" Value="15"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type DataGridColumnHeader}">                    
                <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                    <ContentPresenter
                    ContentTemplate="{TemplateBinding ContentTemplate}"
                    Content="{TemplateBinding Content}"
                    VerticalAlignment="Center"                                
                    HorizontalAlignment="Center"                                
                    Margin="10,2"
                    />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="LightGray"></Setter>
        </Trigger>
    </Style.Triggers>        
</Style>

【讨论】:

  • 这仍然会为 all 列标题添加边距。
  • 根据他的评论,这不是他想做的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多