2009-05-26 92 views
26

的最后一栏我有3列一个GridView一个ListView。我希望最后一列占用ListView的剩余宽度。WPF:延长ListView的GridView控件

+0

这是一个[伟大的链接](http://stackoverflow.com/questions/5573152/how-to-resize-a-certain-control-based-on-window-size-in-wpf#5573895)对的。 – FodderZone 2012-12-19 17:33:30

回答

8

有一种方法可以做到这一点使用的行为模式

<ListView HorizontalAlignment="Stretch" 
          Behaviours:GridViewColumnResize.Enabled="True"> 
        <ListViewItem></ListViewItem> 
        <ListView.View> 
            <GridView> 
                <GridViewColumn  Header="Column *" 
                                   Behaviours:GridViewColumnResize.Width="*" > 
                    <GridViewColumn.CellTemplate> 
                        <DataTemplate> 
                            <TextBox HorizontalAlignment="Stretch" Text="Example1" /> 
                        </DataTemplate> 
                    </GridViewColumn.CellTemplate> 

请参阅以下链接的一些例子和链接阅读更多http://lazycowprojects.tumblr.com/post/7063214400/wpf-c-listview-column-width-auto

而且看到日e源代码。退房 https://github.com/rolfwessels/lazycowprojects/tree/master/Wpf

+0

“行为:GridViewColumnResize.Width”和“行为:GridViewColumnResize.Enabled”在WPF中不存在;你在使用第三方框架吗?提到这一点本来是有用的。现在下调,直到您的答案被修正/更新。 – Krythic 2017-11-08 22:10:35

+0

@Krythic它认为你可能错过了我解释的部分,你需要添加一些源代码..它们被称为行为...是wpf的一部分。查看github链接,将其添加到您的源代码中。 – 2017-12-01 08:26:41

+0

嗯,我在2011年写道,我不再真的做WPF了,但我会想象这个问题已经解决了。 – 2017-12-01 08:28:40

6

快速&脏

XAML:

<ListView SizeChanged="ListView_SizeChanged" Loaded="ListView_Loaded" > 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="col1" Width="100" /> 
      <GridViewColumn Header="col1" Width="Auto" /> 
      <GridViewColumn Header="col1" /> 
     </GridView> 
    </ListView.View> 
</ListView> 

CS:

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    UpdateColumnsWidth(sender as ListView); 
} 

private void ListView_Loaded(object sender, RoutedEventArgs e) 
{ 
    UpdateColumnsWidth(sender as ListView); 
} 

private void UpdateColumnsWidth(ListView listView) 
{ 
    int autoFillColumnIndex = (listView.View as GridView).Columns.Count - 1; 
    if (listView.ActualWidth == Double.NaN) 
     listView.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 
    double remainingSpace = listView.ActualWidth; 
    for (int i = 0; i < (listView.View as GridView).Columns.Count; i++) 
     if (i != autoFillColumnIndex) 
      remainingSpace -= (listView.View as GridView).Columns[i].ActualWidth; 
    (listView.View as GridView).Columns[autoFillColumnIndex].Width = remainingSpace >= 0 ? remainingSpace : 0; 
} 
+2

忽略滚动条的样子。 – Mark 2013-04-14 14:59:09

5

如何使用样式

<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}"> 
    <Setter Property="Background" Value="{x:Null}"/> 
    <Setter Property="Foreground" Value="{x:Null}"/> 
    <Setter Property="BorderBrush" Value="{x:Null}"/> 
    <Setter Property="Width" Value="1000"/> 
</Style> 

<ListView> 
    <ListView.View> 
     <GridView> 
      <GridViewColumn Header="Abc"/> 
      <GridViewColumn Header="" HeaderContainerStyle="{DynamicResource GridViewExtraStyle}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 
-2

我用苍白强麦的建议对于小的修改:

<Style x:Key="GridViewExtraStyle" TargetType="{x:Type GridViewColumnHeader}"> 
    <Setter Property="Background" Value="{x:Null}"/> 
    <Setter Property="Foreground" Value="{x:Null}"/> 
    <Setter Property="BorderBrush" Value="{x:Null}"/> 
</Style> 

<ListView> 
    <ListView.View> 
     <GridView ColumnHeaderContainerStyle="{DynamicResource GridViewExtraStyle}"> 
      <GridViewColumn Header="Abc" Width="{Binding Path=mywidth}"/> 
     </GridView> 
    </ListView.View> 
</ListView> 
-2

您不能删除最后一列,但你可以干什么一点幻想。

  <ControlTemplate TargetType="GridViewColumnHeader"> 
       <Grid> 
        <ContentPresenter x:Name="HeaderContent" 
              Content="{TemplateBinding Content}" ... /> 
        <Thumb x:Name="PART_HeaderGripper" ... /> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasContent" 
          Value="false"> 
         <Setter Property="Visibility" 
           Value="Collapsed" 
           TargetName="PART_HeaderGripper" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
-1

我还没有看到一个单行/简单的XAML唯一的解决方案。设置的宽度是适当的设计视图,然后修改窗口大小变化这样的宽度:

Private Sub winMain_SizeChanged(sender As Object, e As SizeChangedEventArgs) Handles Me.SizeChanged 
    TryCast(lvwDownload.View, GridView).Columns(3).Width = lvwDownload.ActualWidth - 340 
End Sub 

注意:此逻辑不改变/悬停一列的宽度的另一调整大小时。填写最后一列的列表视图非常棒。