Created
September 7, 2016 14:11
-
-
Save qwerty2501/11e5bfd1cc368c19ddf693ffd1afe132 to your computer and use it in GitHub Desktop.
Xamarin.Formsバッドノウハウ ListView編
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
・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