【问题标题】:WPF - how to fill whole space of ListView by column headersWPF - 如何按列标题填充 ListView 的整个空间
【发布时间】:2020-01-23 17:30:56
【问题描述】:

我有五列的 ListView。这些列有宽度。但是最后一列之后的空白存在问题。我想摆脱它。不幸的是,我不知道该怎么做。

现在的情况:

如您所见,第 5 列之后有空白空间。我只想设置第 2 - 5 列的静态宽度(假设为 100),以某种方式将它们向右对齐,并让第 1 列填充剩余的空间。因此,当我调整主窗口的大小时,这四列的大小应该仍然相同,但第一列应该更宽。

XAML:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <ListView Name="ListView1" Grid.Column="0" Width="Auto" >
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Column1" Width="200"/>
                <GridViewColumn Header="Column2" Width="100"/>
                <GridViewColumn Header="Column3" Width="100"/>
                <GridViewColumn Header="Column4" Width="100"/>
                <GridViewColumn Header="Column5" Width="100"/>
            </GridView>
        </ListView.View>
    </ListView>
</Grid>

【问题讨论】:

标签: c# wpf xaml listview


【解决方案1】:

这是一个可行的解决方案,但它有点复杂。除了第一列之外的其他列必须共享相同的宽度。这是 XAML

ListView Name="ListView1" Grid.Column="0" Width="auto" SizeChanged="ListView1_SizeChanged">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Column1" Width="200"/>
                <GridViewColumn Header="Column2" Width="{Binding EqualSize}"/>
                <GridViewColumn Header="Column3" Width="{Binding EqualSize}"/>
                <GridViewColumn Header="Column4" Width="{Binding EqualSize}"/>
                <GridViewColumn Header="Column5" Width="{Binding EqualSize}"/>
            </GridView>
        </ListView.View>
    </ListView>

现在根据 ListView 的实际宽度定义“EqualSize”属性。此定义应在 ListView 的 SizeChanged 事件处理程序上更新。代码如下:

private double _equalSize;
    public double EqualSize {
        get { return _equalSize; }
        set {
            if (_equalSize!=value) {
                _equalSize = value;
                RaisePropertyChanged();
            }
        }
    }
    private void ListView1_SizeChanged(object sender, SizeChangedEventArgs e) {
        EqualSize = (colDef.ActualWidth - 200) / 4;
    }// The magic number 200 is the size of the first column and 4 is the number of columns that share the same size

您可以从代码隐藏文件(推荐)或视图模型类中实现它

【讨论】:

  • 您好,以前试过这个,但是错误列表中总是有一个错误,说我无法将“*”转换为长度。虽然我可以构建它,但是当我运行应用程序时,它会引发“System.Windows.Markup.XamlParseException” - 在“System.Windows.Baml2006.TypeConverterMarkupExtension”上提供值引发异常。
  • 是的...我想通了。检查我的答案,我已经更新了。
【解决方案2】:

尝试使用百分比而不是固定大小。

private void ListView_SizeChanged(object sender, SizeChangedEventArgs e)
{
    ListView listView = sender as ListView;
    GridView gridView = listView.View as GridView;

    var width = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth;

    var column1 = 0.40;
    var column2 = 0.15;
    var column3 = 0.15;
    var column4 = 0.15;
    var column5 = 0.15;

    gridView .Columns[0].Width = width*column1;
    gridView .Columns[1].Width = width*column2;
    gridView .Columns[2].Width = width*column3;
    gridView .Columns[3].Width = width*column4;
    gridView .Columns[4].Width = width*column5;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2012-12-15
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多