C# 是否共享ViewCell中网格列的宽度?

C# 是否共享ViewCell中网格列的宽度?,c#,xamarin.forms,C#,Xamarin.forms,我希望ListViews ViewCell中的列大小相同。它当前设置为“自动”,最宽的名称应获胜,所有其他列应设置为最宽的标签宽度。目前,它们在每行中具有所有不同的宽度 ListView项目模板示例: <ViewCell> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> / <Column

我希望ListViews ViewCell中的列大小相同。它当前设置为“自动”,最宽的名称应获胜,所有其他列应设置为最宽的标签宽度。目前,它们在每行中具有所有不同的宽度

ListView项目模板示例:

<ViewCell>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" /> /
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Text="{Binding Name}"/>
[....]

/
[....]
在WPF中,我们有属性
SharedSizeGroup
,Xamarin.Forms中是否有类似的内容?
有没有一个没有太多黑客攻击的解决方法?

不幸的是,没有-没有这样的属性

这是一件相当困难的事情,因为您需要测量所有行,然后才能确定哪一行的文本最宽。没有跨平台的方法可以做到这一点。在Android和iOS平台上有很多方法可以做到这一点,但我认为WinPhone没有办法做到这一点

[编辑以反映评论中确定的更好方法]:

另一种方法是使用
OneWayToSource
绑定并跟踪每个listview行的
ColumnDefinition
条目

XamlPage.Xaml:

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="FormsSandbox.XamlPage">
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness" iOS="0,20,0,0" Android="0" WinPhone="0"/>
    </ContentPage.Padding>

    <AbsoluteLayout>
        <ListView x:Name="MyLV" AbsoluteLayout.LayoutBounds="0,0,1,1" AbsoluteLayout.LayoutFlags="All">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid RowSpacing="0" ColumnSpacing="0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="Auto" />
                                <ColumnDefinition Width="*" />
                            </Grid.ColumnDefinitions>
                            <Label Grid.Column="0" Text="{Binding .}" MinimumWidthRequest="50" HorizontalOptions="StartAndExpand" SizeChanged="LabelSizeChanged" />
                            <Label Grid.Column="1" Text="Second Column"/>
                        </Grid>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </AbsoluteLayout>

</ContentPage>


好的,我明白了。你想让我同时绑定字体和字体大小来计算宽度,还是你有类似的想法?我的示例使用一个滑块来调整每个字符像素的简单乘数。显然,对于任何不是固定宽度的字体(大多数字体不是),这是不准确的。但它很简单,对你来说可能足够准确。如果您需要更高的准确性,那么在iOS和Android上,您可以添加一些本机代码来测量文本(它将考虑字体设置)。最简单的方法是使用DependencyService从本机项目提供度量代码。如果您以前没有使用过该技术,请让我知道,我会更新答案以包含它。我以前没有使用过它,很抱歉出现这种情况。。。昨晚我重新思考了我的问题:是否可以绑定每个标签的宽度(一种到源的方式)并绑定模板中所有行的宽度以使用最宽的标签宽度?或者这是一个糟糕的方法?你可以试试——它可能会奏效。请确保绑定
宽度
而不是
宽度请求
,以便它在布局后在实际宽度上运行。实际上,这非常有效。我将用这样做的(更简化的)版本更新我的答案。
using System;
using Xamarin.Forms;
using System.Collections.Generic;

namespace FormsSandbox
{
    public partial class XamlPage : ContentPage
    {
        private double _colSize = 0.0;
        private List<ColumnDefinition> _columns = new List<ColumnDefinition>();

        public XamlPage ()
        {
            InitializeComponent ();

            var data = new List<string> ();

            data.Add ("Lorem ipsum");
            data.Add ("Foo");
            data.Add ("Dolor semet");
            data.Add ("Test");
            data.Add (".");
            data.Add ("Xamarin Forms Is Great");
            data.Add ("Short");
            data.Add ("Longer than Short");
            data.Add ("");
            data.Add ("Hyphenated");
            data.Add ("Non-hyphenated");
            data.Add ("Ironic, eh?");

            MyLV.ItemsSource = data;
        }

        public void LabelSizeChanged (object sender, EventArgs e)
        {
            var label = (Label)sender;
            var grid = (Grid)label.Parent;
            var column = grid.ColumnDefinitions [0];
            if (!_columns.Contains (column)) {
                _columns.Add (column);
            }
            var adjustments = new List<ColumnDefinition> ();
            if (label.Width > _colSize) {
                _colSize = label.Width;
                adjustments.AddRange (_columns);
            } else {
                adjustments.Add (column);
            }
            foreach (var col in adjustments) {
                col.Width = new GridLength (_colSize);
            }
        }
    }
}