C# 动态对齐WPF DataGrid列的宽度
有一个WPFC# 动态对齐WPF DataGrid列的宽度,c#,wpf,mvvm,datagrid,C#,Wpf,Mvvm,Datagrid,有一个WPFDataGrid,具有在Ctrl+MouseWheel事件中动态更改FontSize的功能。 它是使用Caliburn的cal:Message.Attach功能实现的: <!-- xaml --> cal:Message.Attach="[Event PreviewMouseWheel] = [Action ChangeDataGridFont($eventArgs)]" DataGridFontSize是绑定到DataGrid的CellStyle的VM属性 加载时,列
DataGrid
,具有在Ctrl+MouseWheel事件中动态更改FontSize
的功能。它是使用Caliburn的cal:Message.Attach功能实现的:
<!-- xaml -->
cal:Message.Attach="[Event PreviewMouseWheel] = [Action ChangeDataGridFont($eventArgs)]"
DataGridFontSize
是绑定到DataGrid
的CellStyle
的VM属性
加载时,列的宽度与内容对齐-确定:如果用户增加字体大小,则自动调整列宽-确定:
但是,当字体大小减小时,不会调整列。请参见空白:
有没有办法克服这种影响(如果可能,在MvvM的范围内) 更新:看起来我们需要在更改
FontSize
时手动更新列宽。我可以用相应的样式绑定列的宽度:
<Style x:Key="IdCellStyle" TargetType="{x:Type DataGridCell}" >
<Setter Property="Width" Value="{Binding DataContext.ColWidth, Mode=TwoWay,
RelativeSource={RelativeSource AncestorType=UserControl}}" />
....
</Style>
在
DataGridFontSize
setter中,我应该将ColWidth
设置为什么?我刚刚为DataGridColumn
添加了Width
,看起来效果不错。试试看
我看到的是,在您的示例中,所有列的宽度都是固定的。而且在开始时,您没有根据内容调整列。另外:当您最终放大时,“Papineau”不适合列中。@IgorStack如前所述,您可以将宽度固定为您想要的任何大小。我只是把*
放进去,让DataGrid
将所有列扩展到最大值。现在您知道了当您更新字体大小时,也要在代码中更新宽度以使其正常工作。我的观点是,当鼠标滚动时,必须手动调整宽度。希望这有帮助
<Style x:Key="IdCellStyle" TargetType="{x:Type DataGridCell}" >
<Setter Property="Width" Value="{Binding DataContext.ColWidth, Mode=TwoWay,
RelativeSource={RelativeSource AncestorType=UserControl}}" />
....
</Style>
public double ColWidth
{
get => _colWidth;
set
{
_colWidth = value;
NotifyOfPropertyChange();
}
}
<Window.Resources>
<XmlDataProvider x:Key="MockList" XPath="/MockObjects/*" >
<x:XData >
<MockObjects xmlns="">
<MockObject Name="Louis" Type="TTTT" Number="1" />
<MockObject Name="Joseph" Type="TTTT" Number="2" />
<MockObject Name="Papineau" Type="ZZZZ" Number="3" />
</MockObjects>
</x:XData>
</XmlDataProvider>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource MockList}}" >
<DataGrid HorizontalAlignment="Stretch" Margin="10" VerticalAlignment="Stretch"
ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}"
AutoGenerateColumns="False" PreviewMouseWheel="UIElement_OnPreviewMouseWheel">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding XPath=@Name}" Width="*"></DataGridTextColumn>
<DataGridTextColumn Header="Type" Binding="{Binding XPath=@Type}" Width="*"></DataGridTextColumn>
<DataGridTextColumn Header="Number" Binding="{Binding XPath=@Number}" Width="*"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>