質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

1回答

3097閲覧

Xamarin.Formsでアイテムの幅が可変な水平方向に伸びるリストビューを表示する方法を教えてください

mwld

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/02/21 09:39

編集2019/02/21 23:34

Xamarin.Formsでアイテムの幅が可変な水平方向のリストビューを使用したいです。

メモ帳を作っているのですが、ツリー構造になっているジャンルの流れを表示するために、
ジャンル1 -> ジャンル1-1 -> 選択されているジャンル
のように画面に表示したいです。
いろいろと調べた結果、プレビュー版のCollectionViewという物があると知り、サンプルなどを参考に単純化したコードを書いてみました。

xaml

1View 2 3<?xml version="1.0" encoding="utf-8" ?> 4<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 5 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 6 x:Class="PrismTest.Views.MainPage" 7 x:Name="root"> 8 <Grid> 9 <Grid.RowDefinitions> 10 <RowDefinition Height="2*"/> 11 <RowDefinition Height="*"/> 12 <RowDefinition Height="*"/> 13 </Grid.RowDefinitions> 14 <CollectionView Grid.Row="0" ItemsSource="{Binding Items}" 15 ItemsLayout="{x:Static ListItemsLayout.HorizontalList}"> 16 <CollectionView.ItemTemplate> 17 <DataTemplate> 18 <StackLayout Orientation="Horizontal"> 19 <Label Text="{Binding}" BackgroundColor="Red" VerticalOptions="Center" HorizontalOptions="FillAndExpand"/> 20 </StackLayout> 21 </DataTemplate> 22 </CollectionView.ItemTemplate> 23 </CollectionView> 24 <Button Text="Add" Command="{Binding AddItemCommand}" Grid.Row="1"/> 25 <Button Text="Delete" Command="{Binding DeleteItemCommand}" Grid.Row="2"/> 26 </Grid> 27</ContentPage>

C#

1ViewModel 2 3using Prism.Navigation; 4using System; 5using System.Collections.ObjectModel; 6using System.Windows.Input; 7using Xamarin.Forms; 8 9namespace PrismTest.ViewModels 10{ 11 12 public class MainPageViewModel : ViewModelBase 13 { 14 15 public ObservableCollection<string> Items { get; } = new ObservableCollection<string>(); 16 public ICommand AddItemCommand { get; } 17 public ICommand DeleteItemCommand { get; } 18 19 private Random RandomGenerator { get; set; } = new Random(); 20 21 public MainPageViewModel(INavigationService navigationService) 22 : base(navigationService) 23 { 24 AddItemCommand = new Command(_ => 25 { 26 Items.Add(Guid.NewGuid().ToString("N").Substring(0, RandomGenerator.Next(1, 30))); 27 }); 28 29 DeleteItemCommand = new Command(_ => 30 { 31 if (Items.Count > 0) 32 Items.RemoveAt(Items.Count - 1); 33 }); 34 } 35 } 36} 37

このコードはUWPではうまくいくのですが、Androidでは空白ができたり、ジャンル名が折り返されて表示されたりしてしまいます。
何度か追加と削除を繰り返していると、Labelに関係なく同じ幅のStackLayoutが表示されていることに気づいたのですが、どうすればStackLayoutがLabelの幅に合わせてくれるのかわかりません・・・。
このバグをどうしたら取り除けるか、CollectionView以外に水平方向のリストビューを表示する方法があれば教えてください

VisualStudioのソリューションファイル

https://github.com/hwld/CollectionViewTest

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ビューモデルが継承してる ViewModelBase のコードを記載できますか?
また、Xamarin.Forms のバージョンはいくつでしょうか?

割と難しい問題のような気がするので、ビルドできる状態のソリューションをどこかに上げたほうが回答しやすいと思います。

2019-02-22 11:53 追記

上げてもらったもので試してみましたが、確かにレンダリングがおかしいですね。スクロールするたびにセルの幅が変わっています (ItemSizingStrategy="MeasureAllItems" を指定しても同様でした)。
ラベルが改行されてしまう現象は、小さくレンダリングされてしまったセル幅に収まらなくなったために発生しているのだと思います。これは LineBreakMode="NoWrap" を指定することで回避できますが、そもそもセル幅がおかしいので意味ないですね。

原因は少し調べただけだとわからなかったのでとりあえず逃げる手段しか挙げられず申し訳ないですが、CollectionView の代わりに ScrollView を使うという方法もあります。
要素数が多い場合はパフォーマンスの面で CollectionViewListView などが必須になると思いますが、そうでなければ ScrollView の中に StackLayoutGrid を入れ、動的にビューを追加/削除することで逃げれるかもしれません。

とはいえ正攻法ではないと思うので、どなたか水平方向のコレクションビューで UWP/Android サポートした良い感じのソリューションがあれば教えてほしいです。

投稿2019/02/21 12:08

編集2019/02/22 02:57
korosonya

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mwld

2019/02/23 01:53 編集

回答ありがとうございます ソリューションをgithubのリポジトリに上げました ちなみに、Xamarin.Formsはプレビューリリースの4.0.0.169046-pre5を使用しています 追記 一応ScrollView、StackLayoutとビヘイビアを使って書いてみました いろいろと自前で書かなければけないのでメンテナンスが難しそうなので、とりあえずは垂直方向のListViewを使用することにします・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問