https://github.com/jamesmontemagno/MediaPluginを使用して、デバイスから Xamarin のアプリに画像を追加しようとしています。奇妙なことに、アイテムを追加すると、「行間」のある時点で例外が発生します。これをデバッグする方法がわかりません。実装が OnPropertyChanged
間違っていると想定しています。
例外を Try/Catch ブロックでラップしたところ、驚いたことに、アイテムが実際に追加されApp.api.message.MediaFiles.Count()
て増加したことがわかりました。これにより、 Exeption は実際には の後に発生するが、 の時点では発生しないと想定するようになり.Add(Item)
ます。
これは、OnPropertyChanged()
(しかし、デバッガーがコードのその部分を表示しないのはなぜですか?) または Xamarin が Listview を にバインドする舞台裏の魔法のいずれかである必要があります...Thumbnail
。
ただし、これらのオプションはどちらも私にとって比較的新しいものであるため、間違いや誤解がここにある可能性が非常に高く、これを調査する方法または場所に関するヒントをいただければ幸いです。
これが私が詳細に行うことです:
[...]
public MainPage()
{
InitializeComponent();
BindingContext = App.api.message;
Media.ItemsSource = App.api.message.MediaFiles;
[...]
}
XAML のリストビュー:
[...]
<ListView x:Name="Media" BackgroundColor="#f1f1f1" HasUnevenRows="true" IsVisible="true" Header="Media" ItemTapped="RemoveImage" RowHeight="90" HeightRequest="120">
<ListView.ItemTemplate>
<DataTemplate>
<Image Source="{Binding thumbnail}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
[...]
file
画像を選んだり撮ったりすることで、私は次のことを行います。
public void AddFile(MediaFile file)
{
Classes.MessageClass.Media Item = new Classes.MessageClass.Media();
Item.Filename = file.Path;
Item.Thumbnail = ImageSource.FromStream(() =>
{
var stream = file.GetStreamWithImageRotatedForExternalStorage();
return stream;
});
file.Dispose();
FileInfo fileInfo = new FileInfo(Item.Filename);
Item.Size = fileInfo.Length;
Console.WriteLine("\n\nOriginal File:{0} \n{1:###,###,###} Bytes\nCaption: {2}\nContent Type: {3}", Item.Filename, Item.Size, Item.Caption,Item.ContentType);
try
{
App.api.message.MediaFiles.Add(Item); //EXEPTION "Specified cast not Valid"
}
catch (Exception ex)
{
Console.WriteLine("Exeption: " + ex.Message + " " + ex.Data.Values.ToString());
}
Console.WriteLine("Attached Images: " + App.api.message.MediaFiles.Count());
App.api.message.HasMedia = true;
UpdateImagesUI();
}
そして最後に私の定義Classes.MessageClass.Media
. (null値の問題を排除するために値を追加しました):
public class Media
{
public string Caption { get; set; } = "";
public string Filename { get; set; } = "";
ImageSource thumbnail;
public long Size { get; set; } = 0;
public string ContentType { get; set; } = "";
public bool IsVideo { get; set; } = false;
public ImageSource Thumbnail
{
get
{
return thumbnail;
}
set
{
if ((thumbnail != value) && (value != null))
{
thumbnail = value;
Console.WriteLine("Image Updated");
OnPropertyChanged("Thumbnail");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var changed = PropertyChanged;
if (changed != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
そしてin MessageClass()
:MediaFiles = new ObservableCollection<Media>();
最後にスタック:
(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) [0x0000f] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.0.0.15/src/Xamarin.iOS/mcs/class/referencesource/System/compmod/system/collections/objectmodel/observablecollection.cs:288
at System.Collections.ObjectModel.ObservableCollection`1[T].OnCollectionChanged (System.Collections.Specialized.NotifyCollectionChangedAction action, System.Object item, System.Int32 index) [0x00000] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.0.0.15/src/Xamarin.iOS/mcs/class/referencesource/System/compmod/system/collections/objectmodel/observablecollection.cs:351
at System.Collections.ObjectModel.ObservableCollection`1[T].InsertItem (System.Int32 index, T item) [0x00024] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.0.0.15/src/Xamarin.iOS/mcs/class/referencesource/System/compmod/system/collections/objectmodel/observablecollection.cs:219
at System.Collections.ObjectModel.Collection`1[T].Add (T item) [0x00020] in /Library/Frameworks/Xamarin.iOS.framework/Versions/12.0.0.15/src/Xamarin.iOS/mcs/class/referencesource/mscorlib/system/collections/objectmodel/collection.cs:67
at SegelnBlogsEditor.MainPage.AddFile (Plugin.Media.Abstractions.MediaFile file) [0x0009e] in /Users/hinnerkweiler/wwwroot/SegelnBlogsEditor/SegelnBlogsEditor/MainPage.xaml.cs:292