WinUI3 DatePicker控件左右存在固定边距无法自适应Grid列宽
我在使用WinUI3的DatePicker控件,测试覆盖的Windows App SDK版本为1.0.3和1.1.1。
使用中发现DatePicker显示时左右两侧会出现类似固定边距的区域,导致该控件与视图内其他控件的对齐效果不一致。下方截图展示了该问题:为清晰呈现边距,我在背景添加了标识元素,深灰色区域即为DatePicker的多余边距,同时添加两个红色箭头指向对应区域(截图拍摄于深色模式下)。
我的使用场景为将DatePicker放置在Grid的某一列中,预期控件可自适应所在Grid列的宽度,当前实现代码如下:
<DatePicker Grid.Column="2" Orientation="Horizontal" MinWidth="200" HorizontalAlignment="Stretch" Date="{x:Bind Path=ViewModel.MyDate, Mode=TwoWay}"/>
我已尝试为DatePicker设置负Margin、将Padding设为0,两种方式均未生效,需要找到无需完全重写控件模板即可消除该多余边距的解决方案。
问题补充
经排查,该问题与DatePicker允许的最大宽度限制有关:该控件默认最大宽度略小于500单位,若强制其拉伸超过该宽度,就会出现上述多余边距(见第二张截图)。以下是可复现该问题的完整示例代码:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"></ColumnDefinition> <!-- 标签列 --> <ColumnDefinition Width="20"></ColumnDefinition> <!-- 间隔列 --> <ColumnDefinition Width="500"></ColumnDefinition> <!-- 内容列 --> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="Auto"></RowDefinition> <RowDefinition Height="*"></RowDefinition> </Grid.RowDefinitions> <!-- 标题行 --> <TextBlock Grid.Row="0" Grid.Column="2" MinWidth="200" >宽度为500的列</TextBlock> <!-- 第一行:TextBox控件 --> <TextBlock Grid.Row="1" Grid.Column="0" Text="文本框标签" VerticalAlignment="Center" Margin="0,0,20,0"></TextBlock> <TextBox Grid.Row="1" Grid.Column="2" MinWidth="200" ></TextBox> <!-- 第二行:DatePicker控件 --> <TextBlock Grid.Row="2" Grid.Column="0" Text="日期选择器标签" VerticalAlignment="Center" Margin="0,0,20,0"></TextBlock> <DatePicker Grid.Row="2" Grid.Column="2" MinWidth="200" HorizontalAlignment="Stretch"></DatePicker> </Grid>
从运行效果可见,TextBox控件可正常拉伸至500宽度,但DatePicker无法达到该宽度。
问题根源是WinUI3默认控件样式为DatePicker设置了固定默认MaxWidth值(有效像素为456),和Margin、Padding属性无关,因此设置负Margin、清零Padding的操作都不会生效。
无需重写控件模板,只需在DatePicker上显式设置MaxWidth属性覆盖默认值即可解决:
- 若需要控件随父容器自由拉伸,直接设置
MaxWidth="Infinity" - 若仅需适配当前固定宽度的列,直接设置
MaxWidth为对应列宽值即可
修改后的控件代码如下:
<DatePicker Grid.Column="2" Orientation="Horizontal" MinWidth="200" MaxWidth="Infinity" HorizontalAlignment="Stretch" Date="{x:Bind Path=ViewModel.MyDate, Mode=TwoWay}"/>
添加该属性后,DatePicker会和同列的TextBox行为一致,正常拉伸填满Grid列,两侧多余边距会完全消失。
补充说明:WinUI3默认样式中
TimePicker等同类选择控件也存在相同的固定MaxWidth默认设置,遇到同类控件拉伸失效问题可优先检查该属性。
内容的提问来源于stack exchange,提问作者Martin

