WPF DataGrid - 最后一列MinWidth = Auto,Width = *

时间:2017-09-28 08:27:49

标签: wpf datagrid

在WPF中如何让最后一列填充剩余空间具有基于内容的最小宽度(自动)。

因此,如果内容很短,则会拉伸以填充剩余空间,但如果内容很长,则会滚动而不是裁剪文本。

不幸的是,列上的MinWidth属性是Double,不能设置为Auto。

顶部网格显示带有短文本和宽度=“自动”的列。底部网格显示长文本,宽度=“*”。

理想情况下,在顶部示例中,第二个col将延伸到结尾,在底部示例中,我们将滚动。

enter image description here

XAML:

 <StackPanel>
        <DataGrid Name="DataGrid1" Margin="5" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Width="100" Binding="{Binding Col1}"></DataGridTextColumn>
                <DataGridTextColumn Width="Auto" Binding="{Binding Col2}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
        <DataGrid Name="DataGrid2" Margin="5"  AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Width="100" Binding="{Binding Col1}"></DataGridTextColumn>
                <DataGridTextColumn Width="1*" Binding="{Binding Col2}"></DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </StackPanel>

代码背后:

 Public Class ExampleObject
    Public Property Col1 As String
    Public Property Col2 As String
End Class

Public Sub New()

    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.


    Dim items1 As New List(Of ExampleObject)
    items1.Add(New ExampleObject With {.Col1 = "Hello", .Col2 = "World"})
    DataGrid1.ItemsSource = items1

    Dim items2 As New List(Of ExampleObject)
    items2.Add(New ExampleObject With {.Col1 = "Hello", .Col2 = "World, Please provide a code sample when asking a question: stackoverflow.com/help/mcve"})
    DataGrid2.ItemsSource = items2
End Sub

2 个答案:

答案 0 :(得分:0)

您无法在默认DataGrid中执行此操作。最小和最大尺寸(宽度或高度)必须设置为数值。将列大小设置为Auto或to * value定义它在DataGrid中的行为方式,您必须选择要使用的行为类型。你不能同时拥有这两个。它有点像说你希望你的控件同时是红色和蓝色。

您可能会以某种方式实现目标,但我认为需要将DataGrid重写为自定义实现。

答案 1 :(得分:0)

虽然从技术上讲不是最后一列填充空间但是最小宽度为Auto,但是通过添加填充空间但被设置为显示为最后一个真实列的一部分的虚拟列,以下内容为用户提供了相同的外观。

需要注意几点:

  • 如果根据单元格处理事件或者网格不是只读取的,您可能需要考虑用户可能选择填充列
  • 我没有在这个例子中设置标题样式。

     <DataGrid Name="DataGrid1" Margin="5" IsReadOnly="True" AutoGenerateColumns="False" GridLinesVisibility="None">
        <DataGrid.CellStyle>
            <Style TargetType="DataGridCell">
                <Setter Property="BorderBrush" Value="Black"></Setter>
                <Setter Property="BorderThickness" Value="0,0,1,1"></Setter>
            </Style>
        </DataGrid.CellStyle>
        <DataGrid.Columns>
            <DataGridTextColumn Width="100" Binding="{Binding Col1}"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Col2}">
                <DataGridTextColumn.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="BorderBrush" Value="Black"></Setter>
                        <Setter Property="BorderThickness" Value="0,0,0,1"></Setter>
                    </Style>
                </DataGridTextColumn.CellStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Width="1*" x:Name="FillerColumn"/>
    
        </DataGrid.Columns>
    </DataGrid>