###前提・実現したいこと
画像の部分表示がしたい
はおかげさまで無事解決しました。ありがとうございます。
普通のImageの代わりとして表示する時は特に問題が出なかったのですが、ListViewの各セルの中に表示しようとしたときに、新たな問題が発生してしまいました。
やりたいこととしては、ListViewのCustomCellの中にCropした画像を表示したいということになります。アドバイスよろしくお願いします。
###発生している問題・エラーメッセージ
iOSとAndroidで微妙に症状が異なります。
まず、ListViewを使ったページに遷移した直後はどちらも期待通りの表示がなされています。
Androidではこの状態から1セル分上にスクロールするだけ(見えていなかった最初のセルが表示されるところ?)で強制終了してしまいます。iOSの方は上方向のスクロールは一番下まで問題がなく見ることができますが、途中で下にスクロールしようとしたときに、画面上部に消えたセルが再表示されるところで同じように強制終了してしまいます。
エラーメッセージ
Cannot access a closed Stream.
というウィンドウが表示されますが、Stacktraceは空になっています。
アプリケーション出力の中に
The application may be doing too much work on its main thread
というメッセージが出力されています。
Value cannot be null.
Parameter name: data
このときのStacktraceには
xxxx.iOS.Application.Main(System.String[] args)
だけ表示されています。
###該当のソースコード
public class TestPage : ContentPage { class Data { public string Image { get; set; } } public TestPage() { var ar = new List<Data>(); foreach (var n in Enumerable.Range(0, 20)) { ar.Add(new Data { Image = "ネット上の画像のURL",//全セル同じ画像でテスト }); } var listView = new ListView { ItemsSource = ar, }; listView.ItemTemplate = new DataTemplate(() => { var image = new Image(); image.SetBinding(Image.SourceProperty, "Image"); ////////////// ここから image.BindingContextChanged += (sender, e) => { base.OnBindingContextChanged(); var img = (Image)sender; var imgSrc = (UriImageSource)img.Source; var uri = imgSrc.Uri.ToString(); System.Diagnostics.Debug.WriteLine(uri); var data = DependencyService.Get<IImage>().Read(uri); Stream stream = new MemoryStream(data); image.Source = ImageSource.FromStream(() => { return stream; }); }; ////////////// ここまで return new ViewCell { View = new StackLayout { Padding = new Thickness(20, 10, 20, 10), Spacing = 10, Orientation = StackOrientation.Horizontal, Children = { image, }, }, }; }); Content = listView; } }
※Android/iOS個別処理のところのソースはこちらを参照
###試したこと
ここから〜ここまでで挟んだ部分がCropした画像を貼り付ける処理になります。(このやり方自体もわからなかったのですが、https://forums.xamarin.com/discussion/23049/how-to-show-images-from-a-list-base64-encoded-stringを参考にしました)
問題が起こる動作をする前にここにBreakPointを仕掛けても引っかからないことは確認しています。
ここをコメントアウトした場合も問題なく動作することを確認しています。
追記:
var data = DependencyService.Get<IImage>().Read(uri); Stream stream = new MemoryStream(data); image.Source = ImageSource.FromStream(() => { return stream; });
image.Source = ImageSource.FromUri(new Uri(uri));
と変えた場合は問題がおきませんでした(cropはされませんが)
また、iOS版のエラーメッセージの中に
Parameter name: data
とあるので、ここのdataという変数名を別のものに書き換えたのですが、エラーメッセージは同じままでした。
あと、dataをクラスのメンバー変数にして消えないようにしても、症状は変わりませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
Xamarin 6.2(build 1829)
Mac Note Pro
OS X Yosemite(10.10.5)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。