在GridViewColumn中如何将复选框居中显示?

4

我目前在努力让我的CheckBoxGridViewColumn中居中。

我已经定义了CheckBoxStyle,如下所示:

<Style TargetType="{x:Type CheckBox}" x:Key="DataGridCheckBox">
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="HorizontalContentAlignment" Value="Center" />
    <Setter Property="IsEnabled" Value="False" />
    <Setter Property="Margin" Value="4" />
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type GridViewColumn}},Path=ActualWidth}" />
</Style>

我的CheckBox被添加到GridViewColumn中,使用了如下的DataTemplate

<GridViewColumn Header="Comment">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <CheckBox Style="{StaticResource DataGridCheckBox}" IsChecked="{Binding PropertyItem.Comment, Converter={StaticResource booleanConverter}, ConverterParameter='string'}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

但是我的问题是,即使调整列的大小,CheckBox仍然保持左对齐。
你有什么想法吗?
谢谢您提前的帮助,Sonny
编辑:我一直在测试一个空窗口中的CheckBox,我认为问题可能与CheckBox控件有关。如果我制作一个非常宽的CheckBox,我仍然似乎无法使其内部的CheckBox部分对齐。它总是想要去到左上角。根据名称,ContentAlignment属性似乎只能对齐内容。

如果您将 HorizontalAlignment="Center" 属性移动到 CheckBox 的内联位置并且不使用样式,会发生什么情况?是否存在相同的问题? - Aaron McIver
是的,同样的问题。似乎没有任何对齐属性有所改变,但我知道模板已经被应用了,因为复选框在设计时正确启用,并且属性看起来也正确。 - Sonny Boy
你是否找到了如何将样式应用于复选框列?我很想知道。 - Jason Ridge
1个回答

13
尝试将ListViewItem的HorizontalContentAlignment设置为Stretch。
<ListView ...>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    <ListView.ItemContainerStyle>
    <!-- ... -->
</ListView>

更新

这是一个仅使用Xaml的示例,可以将CheckBox居中。复制粘贴并尝试一下 :)

<Grid>
    <ListView>
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.Resources>
            <Style TargetType="{x:Type CheckBox}" x:Key="DataGridCheckBox">
                <Setter Property="HorizontalAlignment" Value="Center" />
                <Setter Property="HorizontalContentAlignment" Value="Center" />
                <Setter Property="IsEnabled" Value="False" />
                <Setter Property="Margin" Value="4" />
                <Setter Property="VerticalAlignment" Value="Center" />
                <Setter Property="VerticalContentAlignment" Value="Center" />
                <Setter Property="Width" Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type GridViewColumn}},Path=ActualWidth}" />
            </Style>
        </ListView.Resources>
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Comment">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox Style="{StaticResource DataGridCheckBox}" IsChecked="True"/>
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>
            </GridView>
        </ListView.View>
        <ListViewItem>Item1</ListViewItem>
        <ListViewItem>Item2</ListViewItem>
        <ListViewItem>Item3</ListViewItem>
    </ListView>
</Grid>

抱歉,Mel。我正在使用DataGrid而不是ListView。你有一些可以翻译的代码吗?我似乎找不到我的GridViewColumns的HorizontalContentAlignment属性。 - Sonny Boy
@Sonny Boy:你使用的是哪个DataGrid?对于MS DataGrid,它们被称为DataGridColumn等,所以我认为你在使用ListView。 - Fredrik Hedblad
抱歉...我刚才有点糊涂了。我已经按照你建议的更改了,但是没有看到任何区别。 - Sonny Boy
@Sonny Boy: 我创建了一个仅使用 XAML 的例子,其中复选框居中显示。 - Fredrik Hedblad
好东西。我已经将样式添加到我的App.xaml文件中,并且它在整个应用程序中都有效。现在我只需要将其限制在具有复选框的列中... :) - Sonny Boy
它可以正常工作,但会破坏Expression Dark主题... :( 请问您能告诉我如何实现它而不出现这个问题吗? - NoWar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接