在WPF ListView/Gridview中设置列背景

sta*_*son 11 wpf xaml listview gridview styles

我想在WPF GridView中设置列的背景.许多Google搜索结果都指向设置GridViewColumn.CellTemplate以更改列的外观.但是,在设置背景颜色时我遇到了一个问题; 它没有拉伸来填充细胞:

丑陋的网格视图

这是我正在使用的xaml:

<Window x:Class="ScratchPadWpf.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Window1" Width="300" Height="300">
  <Grid>
    <ListView ItemsSource="{Binding}">
      <ListView.View>
        <GridView>
          <GridViewColumn>
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <Grid Background="Red">
                  <TextBlock Text="{Binding FirstName}"/>
                </Grid>
              </DataTemplate>
            </GridViewColumn.CellTemplate>  
          </GridViewColumn>
          <GridViewColumn>
            <GridViewColumn.CellTemplate>
              <DataTemplate>
                <Grid Background="Yellow">
                  <TextBlock Text="{Binding LastName}"/>
                </Grid>
              </DataTemplate>
            </GridViewColumn.CellTemplate>  
          </GridViewColumn>
        </GridView>
      </ListView.View>
    </ListView>
  </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

和xaml.cs一样好的措施:

public partial class Window1 : Window
{
  public Window1()
  {
    InitializeComponent();
    DataContext = new[]
    {
      new {FirstName = "Jim", LastName = "Bob"},
      new {FirstName = "Frank", LastName = "Smith"},
      new {FirstName = "Tooth", LastName = "Paste"},
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

将DataTemplate的Grid的宽度和高度设置为大于具有负边距的单元格可以产生接近的结果,但是如果您调整列的大小,则问题会再次出现.

<Grid Background="Yellow" Height="22" Width="50" Margin="-6">
Run Code Online (Sandbox Code Playgroud)

还是很难看

有没有办法用颜色填充单元格?

Ken*_*art 15

设置HorizontalContentAlignmentItemContainerStyle:

<ListView ItemsSource="{Binding}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>
Run Code Online (Sandbox Code Playgroud)

结果:

替代文字

  • 唉,GridViewRowPresenter将保证金硬编码为6,0,6,0.我担心解决这个问题需要花费大量的工作. (5认同)
  • 我一直在尝试解决列边距的类似问题 - 感谢您指出硬编码。现在,问题是为什么?猜猜我们永远不会知道。 (2认同)

mik*_*ike 5

挖了一个旧线程,但是我发现了一个躲避它的方法

<Grid Background="{Binding backGround}" Margin="-6,0,-6,0">
  <TextBlock Margin="6,0,6,0" Text="{Binding myText}" TextAlignment="Right" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

移动页边距,使背景色填充整个单元格,然后将它们移回原处,以便文本仍位于正确的位置。现在可以正常工作,直到正确修复为止。

  • 在挖出这个已经挖好的线程时;我很想知道这种现象现在是否已“解决”?在离开编码四年之后,我正在尝试学习WPF,似乎找不到更好的解决方案来创建不同颜色的无缝列背景。任何可以向我指出现代/更好方法的人都欢迎使用:D (2认同)