Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Xamarin.Formsバッドノウハウ ListView編
・Xamarin.FormsのUWP版ListViewだと仮想化が有効にならない
UWPの仕様上常にListViewは仮想表示されることになっているが、実際には仮想化されず追加したぶんだけListViewItemが生成される。
原因について恐らくではあるが、Xamarin.FormsのUWP版ListViewの実装でUWPのListViewItemのMinHeightを0に設定されているのが原因。
UWPの挙動として、ListViewItemの高さを算出できなかった時にMinheightをもとに仮想表示に必要な高さを求めるようになっているらしく、
仮に1万個追加されたとしてもMinHeightが0だと高さ0のItemが追加されたとみなされるため全て表示しようとする。そのためListViewItemが大量に生成される。
この現象はXamarin.FormsのDatatemplate内のHeightRequestを設定してもなぜか解決しなかった。
この現象を解決するにはUWPのプロジェクト内にあるAppクラスのリソースにFormsListViewItemをKeyとしたStyleリソースにMinHeightに0以外の数値を設定するSetterを定義するか、
もしくはMinHeightのSetterを定義しないことで解決する。(MinHeightは規定値の場合0になるがなぜかListViewItemは大量に生成されない)
ただし、この行為は元々Xamarin.FormsにあるFormsListViewItemリソースを上書きする行為なので、注意すること。
元のListViewのスタイルをそのまま使いたい場合は、
https://github.com/xamarin/Xamarin.Forms/blob/5e553f6195e66e48688b8ab324f1bab1e9251f0a/Xamarin.Forms.Platform.UAP/Resources.xaml
からFormsListViewItemのStyleリソースをコピーしてきてMinHeightのSetterを消す・・・ぐらいしか思いつかいない。
あまりにもスマートじゃない上にかなりよろしくないと思うのでissueなげてMinHeightのSetter消すように書きました。糞英語ですが。
https://bugzilla.xamarin.com/show_bug.cgi?id=43299
・そもそもXamarin.FormsのListViewはメモリリークする
現在ListViewはメモリリークするバグがあるみたいです。
https://bugzilla.xamarin.com/show_bug.cgi?id=24982
あまり詳しくしらべてないですが、UWPでもListViewゴリゴリ操作してたらメモリ消費量1GBとかになったことがあったのでUWPでも発生するかもしれません。
結論:
解決策として、
・ListViewの使用をあきらめる。
・みんなの味方カスタムレンダラを使う
が挙げられます。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment