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