残念ながら、このようなプロパティはありません。
これは、どの行が最も広いテキストを持つかを調べる前に、すべての行を測定する必要があるため、やりにくいことです。それを行うためのクロスプラットフォームの方法はありません。 AndroidとiOSのプラットフォームレベルでそれを行う方法はありますが、私はWinPhoneのための方法はないと思います。
[コメントで識別さより良いアプローチを反映するように編集]:
代替的には、各リストビューの行のColumnDefinition
エントリのOneWayToSource
バインディングおよび保持トラックを使用することです。
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>
XamlPage.xaml.cs:
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);
}
}
}
}
![Screenshot of current solution](https://i.stack.imgur.com/q6IM8.png)
わかりました。あなたは私にフォントをもバインドして、幅を計算するためにフォントサイズをあわせてもらいたいのか、それとも似たようなことをしたいのですか? – Jannik
私の例では、スライダーを使用して、1文字あたりのピクセルの単純乗数を調整します。明らかに固定幅でないフォント(ほとんどのフォントはそうではない)については、これは正確ではありません。しかしそれは簡単で、あなたのために十分正確かもしれません。より高い精度が必要な場合は、iOSとAndroidでテキストを測定するネイティブコードを追加できます(フォント設定が考慮されます)。これを行う最も簡単な方法は、DependencyServiceを使用してネイティブプロジェクトから測定コードを提供することです。それ以前にそのテクニックを使用していない場合は、私に知らせてください。 –
私は前もって使い慣れていません...昨晩私の質問を思い出しました:テンプレート内のすべての行の各ラベルの幅をバインドして(ソースへの一方通行)、バインド幅をバインドできないでしょうか?最も幅の広いラベルの幅を使用しますか?それとも悪いアプローチですか? – Jannik