2017-09-01 109 views
0

我有一个ListView绑定到我想以表格方式呈现的对象集合。我创建了一个ListView.ItemTemplate使用星形尺寸不产生统一布局的网格数据模板

<ListView.ItemTemplate> 
      <DataTemplate> 
        <Grid BorderBrush="{StaticResource ApplicationForegroundThemeBrush}" BorderThickness="1,0,1,1" DataContext="{Binding Wpn}" VerticalAlignment="Stretch" > 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="4*"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="1.25*"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="1.25*"/> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="auto"/> 
          <RowDefinition Height="auto"/> 
         </Grid.RowDefinitions> 
         <Border BorderBrush="{StaticResource ApplicationForegroundThemeBrush}" BorderThickness="0,0,1,0" HorizontalAlignment="Stretch"> 
          <TextBlock Text="{Binding WeaponName}" TextTrimming="CharacterEllipsis" Margin="12,0,0,0"/> 
         </Border> 
         <Border BorderBrush="{StaticResource ApplicationForegroundThemeBrush}" BorderThickness="0,0,1,0" Grid.Column="1"> 
          <TextBlock Text="{Binding WeaponLock}" TextAlignment="Center" /> 
         </Border> 
         <Border BorderBrush="{StaticResource ApplicationForegroundThemeBrush}" BorderThickness="0,0,1,0" Grid.Column="2"> 
          <TextBlock Text="{Binding WeaponAttack}" TextAlignment="Center"/> 
         </Border> 
         <Border BorderBrush="{StaticResource ApplicationForegroundThemeBrush}" BorderThickness="0,0,1,0" Grid.Column="3"> 
          <TextBlock Text="{Binding WeaponDamage}" TextAlignment="Center"/> 
         </Border> 
         <Border BorderBrush="{StaticResource ApplicationForegroundThemeBrush}" Grid.Column="4"> 
          <TextBlock Text="{Binding WeaponArc, Converter={StaticResource EnumDisplayConv}}" TextAlignment="Center"/> 
         </Border> 
         <TextBlock Text="test" Grid.Row="1"/> 
        </Grid> 
      </DataTemplate> 
     </ListView.ItemTemplate> 

而一个ListView.ItemContainerStyle,以确保整个的ListView

<ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="HorizontalAlignment" Value="Stretch"/> 
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
       <Setter Property="Margin" Value="0"/> 
       <Setter Property="Padding" Value="0"/> 
       <Setter Property="VerticalAlignment" Value="Stretch"/> 
       <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
      </Style> 
     </ListView.ItemContainerStyle> 

基础上ColumndDefinitions整个宽度的每一项延伸都被明星大小的,我希望看到一个统一的查看每个绑定项目(即所有边界垂直对齐)中的表格,而是在至少第一列中看到自动调整大小,接着在其余列中调整大小。

Bad Column Alignments

任何人都可以指出我要去的地方错了,或者有更好的方法来获取所需的表格看?

+0

你有没有尝试将最小宽度设置为0 n max width to infinite? –

+0

@JustinXL上有哪些元素? – Lindsay

+0

在您的ListViewItem样式上。 –

回答

0

我发现答案埋在MSDN。我需要在DataTemplate中明确设置Grid的宽度。我使用ElementNamePath语法将Width绑定到ListView.ActualWidth属性,并根据需要得出结果。可能对于重复使用模板并不理想,但它在这种情况下起作用。

+0

虽然明确设置网格宽度正在解决问题,但它不是唯一的解决方案。当网格即使没有设置网格宽度本身时,从父网格获得定义的宽度也是足够的。 – grek40

1

不要到ListView内容给予无限的空间,那么它会尊重其给定的空间:

<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 

否则会经常测量其孩子无限的宽度约束,因此网格元素将允许其子女要求无限的空间,然后当一些孩子声称拥有很多空间而其他人根本不需要空间时,它将开始忽略星星大小。


调试布局

如所解释的,父容器需要指定一个限制的宽度,因为无限宽度,网格列星上浆将失败。有一个简单的方法来确定当前的父母是否满足要求:

创建一个自定义控制

public class RestrictiveWidthControl : ContentControl 
{ 
    protected override Size MeasureOverride(Size constraint) 
    { 
     // check constraint. If the constraint.Width is infinite, your parent layout is not ready for reliable grid sizing 
     return base.MeasureOverride(constraint); 
    } 
} 

并将其放置在有问题的XAML区域:

在网格上,这正好可以被放置在相同的水平(相同的网格行/列)作为控制待分析

<local:RestrictiveWidthControl/> 
<Border BorderBrush="Black" BorderThickness="0,0,1,0" HorizontalAlignment="Stretch"> 
    <TextBlock DockPanel.Dock="Left" Text="{Binding Text}" TextTrimming="CharacterEllipsis" Margin="12,0,0,0"/> 
</Border> 

通常,只是包装所分析的控制

<local:RestrictiveWidthControl> 
    <Border BorderBrush="Black" BorderThickness="0,0,1,0" HorizontalAlignment="Stretch"> 
     <TextBlock DockPanel.Dock="Left" Text="{Binding Text}" TextTrimming="CharacterEllipsis" Margin="12,0,0,0"/> 
    </Border> 
</local:RestrictiveWidthControl> 

放入MeasureOverride方法断点并检查输入constraint。如果它是无限的,你的布局需要在某处进行更改。

+0

我加了这个调整,但没有解决问题,输出仍然按照问题中的图像。我已经标记为有帮助,因为它确实解决了调整窗口大小时与布局相关的其他内容。 – Lindsay

+0

@Lindsay也许你需要展示一些更多的XAML ......如果我的解决方案不适合你,那么原因很可能是围绕Listview的一些容器,但我无法了解它。 – grek40