如何使控件在ListView(使用GridView)中填充整个单元格?我玩过各种各样的属性,但控制始终是它的最小尺寸。
这是我的xaml。
<Window x:Class="ListViewUserControlTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ListViewUserControlTest"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="UserControlCell">
<Rectangle Fill="Red" HorizontalAlignment="Stretch" MinWidth="10" MinHeight="10" />
</DataTemplate>
</Window.Resources>
<Grid>
<ListView Name="MyListView">
<ListView.View>
<GridView>
<GridViewColumn Width="30" Header="Col1" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Width="200" Header="Col2" CellTemplate="{StaticResource UserControlCell}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
编辑抱歉,我更改了问题,因为我已将用户控件排除在问题的根源之外。任何控制都会发生这种情况。
答案 0 :(得分:62)
在缩小我的问题之后,我即将与谷歌找到answer here。
基本上由于某种原因,ListViewItems设置为与左对齐。将它们设置为Stretch可以解决此问题。这是通过这样的风格完成的:
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
不幸的是,这会影响每一列,但是您可以按照链接中的说明将其他列的内容设置为left,right,center。
答案 1 :(得分:4)
另一个几乎解决方案是在进入gridviewcolumn的datatemplate中执行以下操作
Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor , AncestorType=ListViewItem, AncestorLevel=1},Path=ActualWidth}">
这导致它将文本框拉伸到列的宽度,但右边缘被剪裁而不是渲染。我尚未解决这个问题。所以已经接受的答案仍然可能是最好的答案。
这是一个实现此目的的DataTemplate示例。
<DataTemplate DataType="{x:Type local:EditableStringElement}"
x:Key="cellSalutation">
<TextBox Text="{Binding _RecipientData._Salutation.Value , Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
IsEnabled="{Binding _RecipientData._Salutation.IsEnabled}"
Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor , AncestorType=ListViewItem, AncestorLevel=1},Path=ActualWidth}">
</TextBox>
答案 2 :(得分:3)
您的用户控件指定“高度”和“宽度”属性的值。不允许任何内容覆盖您明确设置的属性。删除“高度”和“宽度”,控件的容器将能够弄乱大小。
您可能需要设置合理的“MinHeight”和“MinWidth”以防止容器压扁您。
不同的容器会对您的控件尺寸做出不同的处理;例如,Grid会扩展您填充您所在的网格单元格,而StackPanel会将您缩小到最小尺寸。所以你可能也需要处理它。