在将内容保持在中间的同时拉伸 DataGrid 中的 ContentPresenter?
Stretch the ContentPresenter in a DataGrid while keeping the Content in the middle?
我发现让我的 Content
垂直和水平居中的最简单方法是:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="Gray">
<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
但我真的不喜欢我的实际 TextBox
在尝试编辑单元格值时没有填充整个单元格,而是值周围有一个白色框,看起来像这样:
无法为 ContentPresenter
设置 HorizontalContentAlignment
,尽管我通过在我的 ControlTemplate
中使用 TextBox
获得了预期的效果,如下所示:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid VerticalAlignment="Stretch">
<TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" BorderThickness="0" Background="Gray">
</TextBox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
它需要特定的 Binding
才能工作,这违背了可重用性的全部目的。
让白框覆盖整个单元格或完全禁用白框的最佳方法是什么?
我没有使用 ContentPresenter,而是找到了一种将文本框绑定到内容的方法,如下所示:
<Style TargetType="DataGridCell" x:Key="TextBoxTemplateCellStyle" BasedOn="{StaticResource DefaultCellStyle}">
<Setter Property="Width" Value="40" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid>
<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" BorderThickness="0" Background="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
</Style>
</TextBox.Style>
</TextBox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这让我可以将我的文本框拉伸到最大,同时我的灰色单元格中没有小的白色框。
我发现让我的 Content
垂直和水平居中的最简单方法是:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="Gray">
<ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
但我真的不喜欢我的实际 TextBox
在尝试编辑单元格值时没有填充整个单元格,而是值周围有一个白色框,看起来像这样:
无法为 ContentPresenter
设置 HorizontalContentAlignment
,尽管我通过在我的 ControlTemplate
中使用 TextBox
获得了预期的效果,如下所示:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid VerticalAlignment="Stretch">
<TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" BorderThickness="0" Background="Gray">
</TextBox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
它需要特定的 Binding
才能工作,这违背了可重用性的全部目的。
让白框覆盖整个单元格或完全禁用白框的最佳方法是什么?
我没有使用 ContentPresenter,而是找到了一种将文本框绑定到内容的方法,如下所示:
<Style TargetType="DataGridCell" x:Key="TextBoxTemplateCellStyle" BasedOn="{StaticResource DefaultCellStyle}">
<Setter Property="Width" Value="40" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid>
<TextBox Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content.Text}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Center" BorderThickness="0" Background="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Background}">
<TextBox.Style>
<Style TargetType="{x:Type TextBox}">
</Style>
</TextBox.Style>
</TextBox>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这让我可以将我的文本框拉伸到最大,同时我的灰色单元格中没有小的白色框。