2016-04-12 23 views
2

ListViews ViewCellのカラムをすべて同じサイズにしたいと思います。現在autoに設定されており、最も広い名前が勝つはずです。他のすべての列は、最も幅の広いラベルの幅に設定する必要があります。現在、それらは各行のすべての幅が異なります。ViewCellのグリッド列の幅を共有しますか?

ListViewのItemTemplateに例:WPFで

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

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

私たちは財産SharedSizeGroupを持って、Xamarin.Formsで同様のものがありますか? ハッキングのない回避策がありますか?

答えて

1

残念ながら、このようなプロパティはありません。

これは、どの行が最も広いテキストを持つかを調べる前に、すべての行を測定する必要があるため、やりにくいことです。それを行うためのクロスプラットフォームの方法はありません。 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

+0

わかりました。あなたは私にフォントをもバインドして、幅を計算するためにフォントサイズをあわせてもらいたいのか、それとも似たようなことをしたいのですか? – Jannik

+0

私の例では、スライダーを使用して、1文字あたりのピクセルの単純乗数を調整します。明らかに固定幅でないフォント(ほとんどのフォントはそうではない)については、これは正確ではありません。しかしそれは簡単で、あなたのために十分正確かもしれません。より高い精度が必要な場合は、iOSとAndroidでテキストを測定するネイティブコードを追加できます(フォント設定が考慮されます)。これを行う最も簡単な方法は、DependencyServiceを使用してネイティブプロジェクトから測定コードを提供することです。それ以前にそのテクニックを使用していない場合は、私に知らせてください。 –

+0

私は前もって使い慣れていません...昨晩私の質問を思い出しました:テンプレート内のすべての行の各ラベルの幅をバインドして(ソースへの一方通行)、バインド幅をバインドできないでしょうか?最も幅の広いラベルの幅を使用しますか?それとも悪いアプローチですか? – Jannik

0

それはMVVMに来るとき、現在の答えは実際にハックソリューションのビットですが、私はそれを「はい」とマークしました。私はこれが私と私の小さなプロジェクトに受け入れられる解決策だと思う。帽子は私が答えを受け入れた理由だ。他の選択肢がある場合は、私に/私たちに知らせてください。

関連する問題