如何在WPF中将TextBlock居中放置在CellTemplate内?

3
我尝试了HorizontalAlignmentTextAlignment,但它们没有任何效果。
<GridViewColumn Width="Auto" Header="Type">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Type}" HorizontalAlignment="Center"  TextAlignment="Center" />
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

有什么想法吗?

编辑:

Xaml 代码:

<Window x:Class="EffectsWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Effects Editor"
    <DockPanel VerticalAlignment="Stretch">
        <DockPanel.Resources>

        <ListView
                  DockPanel.Dock="Top"
                  HorizontalContentAlignment="Stretch"
                  ItemsSource="{Binding EditorViewModel.AllEffects}">

            <ListView.View>
                <GridView>
                    <GridViewColumn Width="Auto"
                                    DisplayMemberBinding="{Binding Name}"
                                    Header="Name" />

                    <GridViewColumn Width="Auto" Header="Type">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Type}" HorizontalAlignment="Center"  TextAlignment="Center" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>

        <DockPanel Width="100"
                   Height="100"
                   Margin="0,0,20,20"
                   HorizontalAlignment="Right"
                   VerticalAlignment="Bottom">

            <Label Margin="0,0,0,0"
                   Content="Data"
                   DockPanel.Dock="Top" />

            <ListBox
                     VerticalAlignment="Top"/>

        </DockPanel>

    </DockPanel>
</Window>
2个回答

8

你尝试过在列上使用HorizontalContentAlignment吗?

-- 编辑 --

事实证明,很难找到正确的位置来放置这个HorizontalContentAlignment... :)

使用以下内容

<ListView.Resources>
    <Style TargetType="ListViewItem">
        <Setter Property="HorizontalContentAlignment" Value="Center" />
    </Style>
</ListView.Resources>

在ListView中。

Snoop通常可以帮助您走上正确的道路。这个ContentPresenter被ListViewItem使用,并且它从ListViewItem上的ContentAlignment获取其对齐方式。您无法直接访问ListViewItem,这就是为什么您需要那个Style的原因。

完整代码如下:

<DockPanel VerticalAlignment="Stretch">

        <ListView 
          DockPanel.Dock="Top"
          HorizontalContentAlignment="Stretch"
          x:Name="MyListView">
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Center" />
            </Style>

        </ListView.Resources>
            <ListView.View>
                <GridView >

                    <GridViewColumn Width="Auto"
                            DisplayMemberBinding="{Binding Name}"
                            Header="Name" />

                    <GridViewColumn Width="Auto" Header="Type">

                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Type}" HorizontalAlignment="Center"  TextAlignment="Center" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>

        <DockPanel Width="100"
           Height="100"
           Margin="0,0,20,20"
           HorizontalAlignment="Right"
           VerticalAlignment="Bottom">

            <Label Margin="0,0,0,0"
           Content="Data"
           DockPanel.Dock="Top" />

            <ListBox
             VerticalAlignment="Top"/>

        </DockPanel>

</DockPanel>

谢谢Elad,当我输入时,它告诉我在GridColumnView上找不到HorizontalContentAlignment属性。 - Joan Venge
尝试使用Snoop,看看是什么在干扰你。可能有一些元素没有正确设置。或者您可以粘贴完整的代码(XAML和CS)。 - Elad Katz
1
Joan - 这通常可以帮助您走上正确的道路。ContentPresenter是ListViewItem使用的,它从ListViewItem的ContentAlignment获取其对齐方式。您无法直接访问ListViewItem,这就是为什么您需要该样式的原因。 - Elad Katz
1
除此以外,我不知道还有其他的方法,除非使用“蛮力”方法(即使用VisualTreeHelper并检查VisualTree DOM中的特定元素)。 - Elad Katz
1
这就是生活 :) 不过,您可以使用DataGrid,它是一个更好的控件,您可以对其中的任何内容进行控制。 - Elad Katz
显示剩余10条评论

1
很遗憾,无法调整 CellTemplate 中的 TextBlocks 的水平对齐方式。 因为 GridViewRowPresenterCellsHorizontalAlignment 属性设置为其 TemplatedParentHorizontalContentAlignment,而在这种情况下,TemplatedParentListViewItem

所以您需要更改 ListViewItemStyle

如果您使用 snoop 更改 ListViewItemHorizontalContentAlignment,则会发现单元格的对齐方式不会受到影响,因为 HorizontalContentAlignment 值是在创建单元格时设置的。


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