我有一个WPF应用程序,其中包含DataGrid
内的文本。
我希望文本包含在每个单元格中。
我还想为每列设置MinWidth,如果必须,ScrollViewer
应该创建horizonatl滚动条。
我从不希望为任何单元格或DataGrid
本身显示水平滚动条。
如果用户调整窗口大小,行应该增大或缩小以适应文本换行,但是它不应该让coulmns变得太薄以至于它们不再可读。
现在,文本没有换行,因为它在滚动查看器中。 我知道可以通过不同的方式更改此示例以使文本换行,但如上所述,我无法让它按照我想要的方式行事。
<Window x:Class="SampleApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SampleApp"
Title="App" Height="350" Width="525">
<Window.Resources>
<Style x:Key="WrappingTextBlock" TargetType="TextBlock">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
<Style x:Key="WrappingTextBox" TargetType="TextBox">
<Setter Property="TextWrapping" Value="Wrap"/>
</Style>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Stuff ... />
<MoreStuff ... />
<Border Grid.Row="1" Grid.Column="1">
<ScrollViewer>
<StackPanel>
<DataGrid HorizontalAlignment="Left" ItemsSource="{Binding AwesomeObject, Mode=TwoWay}" Margin="5" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="#" Binding="{Binding Number, Mode=TwoWay}"/>
<DataGridTextColumn Header="Header" Binding="{Binding Data, Mode=TwoWay}"/>
<DataGridTextColumn MinWidth="50" Header="Long Text" Binding="{Binding SoMuchText, Mode=TwoWay}" ElementStyle="{StaticResource WrappingTextBlock}" EditingElementStyle="{StaticResource WrappingTextBox}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</ScrollViewer>
</Border>
</Grid>
</Window>
答案 0 :(得分:4)
尝试将列的宽度设置为“*”
<Border Grid.Row="1" Grid.Column="1">
<ScrollViewer>
<StackPanel>
<DataGrid HorizontalAlignment="Left" ItemsSource="{Binding AwesomeObject, Mode=TwoWay}" Margin="5" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Width="10*" Header="#" Binding="{Binding Number, Mode=TwoWay}"/>
<DataGridTextColumn Width="10*" Header="Header" Binding="{Binding Data, Mode=TwoWay}"/>
<DataGridTextColumn Width="50*" Header="Long Text" Binding="{Binding SoMuchText, Mode=TwoWay}" ElementStyle="{StaticResource WrappingTextBlock}" EditingElementStyle="{StaticResource WrappingTextBox}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</ScrollViewer>
</Border>
这意味着第1列将是最小长度并且不断增长 这意味着第2列将是最小长度并且不断增长 这意味着第3列将是最小长度为50且不断增长
您可以使用百分比(.Number *)或长度(数字*)来调整*大小调整
答案 1 :(得分:2)
你不需要将dataGrid放在一个scrollViewer中...你应该设置DataGrid的MAXWidth / Maxheighjt,这样就会出现scrollViewr(已经存在于dataGrid中)......如果你想要Wrap单元格文本
<WPFToolkit:DataGrid Name="programListDataGrid"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
IsReadOnly="True"
ItemsSource="{Binding Path=MyList}"
RowStyle="{StaticResource ResourceKey=dataGridRowStyle}"
SelectedItem="{Binding Path=MyItem,
Mode=TwoWay}"
SelectionMode="Single">
<WPFToolkit:DataGrid.Columns>
<WPFToolkit:DataGridTextColumn MinWidth="100"
MaxWidth="250"
Binding="{Binding Path=ItemName}"
Header="Item Name" />
<WPFToolkit:DataGridTemplateColumn Width="*"
MinWidth="200"
Header="ItemData1">
<WPFToolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ApplicationPath}"
TextWrapping="Wrap"
ToolTip="{Binding ItemData1}" />
</DataTemplate>
</WPFToolkit:DataGridTemplateColumn.CellTemplate>
</WPFToolkit:DataGridTemplateColumn>
<WPFToolkit:DataGridTemplateColumn Width="*"
MinWidth="200"
Header="ItemData2">
<WPFToolkit:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding StandardCLP}"
TextWrapping="Wrap"
ToolTip="{Binding ItemData2}" />
</DataTemplate>
</WPFToolkit:DataGridTemplateColumn.CellTemplate>
</WPFToolkit:DataGridTemplateColumn>
</WPFToolkit:DataGrid.Columns>
</WPFToolkit:DataGrid>
TextBlock
将在消耗空间后换行...我没有尝试使用ElementStyle
,但也应该使用它..所有的宽度和高度仅用于演示你应该使用你的onw值根据需要...... :)
答案 2 :(得分:1)
我的解决方案解决了当希望有Header
文本换行时的情况 - 同时控制列的宽度。我使用内置的DataGridTextColumn
,但为其提供了一个自定义HeaderTemplate
,我在其中控制文本的包装:
<DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="Axle Group No."/> <!-- this stays with defaults -->
<DataGridTextColumn Header="Axle Group Load Measured :(a)" MaxWidth="100" ><!-- NOTE: MaxWidth and template below -->
<DataGridTextColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" TextWrapping="Wrap" />
</DataTemplate>
</DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
如果您希望自定义数据单元格的文本换行,那么最好使用完全可自定义的列类型DataGridTemplateColumn
。该类型允许您以与此类似的方式指定HeaderTemplate
或CellTemplate
:
<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" TextWrapping="Wrap" />
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" TextWrapping="Wrap" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>