iOS UI 的 MVVM 交叉图片选择器插件不会在字节类型视图模型上使用 InMemoryImage 进行更新 属性
MVVM cross picture chooser plugin for iOS UI does not update using InMemoryImage on a Bytes type view model property
我正在构建一个跨平台的 Xamarin 解决方案,使用单独的 iOS / android 项目和共享 PCL 包含使用 MVVM 交叉编写的视图模型(版本 3.5.1框架和插件)。
我正在使用 iOS 设备相机拍照并将值存储在字节变量中,如下所示:
private byte[] _bytes;
public byte[] Bytes {
get { return _bytes; }
set {
_bytes = value;
RaisePropertyChanged (() => Bytes);
}
}
public void TakePhoto ()
{
var task = Mvx.Resolve<IMvxPictureChooserTask> ();
task.TakePicture (500, 90,
stream => {
var memoryStream = new MemoryStream ();
stream.CopyTo (memoryStream);
Bytes = memoryStream.ToArray ();
},
() => {
// perform any cancelled operation
});
}
单击绑定按钮时相机会正确打开,并允许我拍照,但是 UI 中的图像视图在我 select 到 [=50] 后没有更新=] 我拍的照片。
这是我的绑定:
set.Bind(imgPhoto).To(vm => vm.Bytes).WithConversion("InMemoryImage");
set.Bind (btnTakePhoto).To ("TakePhoto");
imgPhoto 在哪里
public MvxImageView imgPhoto { get; set; }
而 btnTakePhoto 是
public UIButton btnTakePhoto { get; set; }
(我已尽力遵循 youtube 上 MVVMcross N+17 教程中使用的绑定语法 -(Stuart,如果您正在回答这个问题,谢谢!)
它在 android 上运行良好,使用相同的视图模型代码并像这样绑定到视图:
local:MvxBind="Bitmap Bytes, Converter=InMemoryImage; Visible Bytes;"
我在应用程序的设置 class 中添加了用于内存转换的引用程序集(我不必为 android 执行此操作):
protected override List<Assembly> ValueConverterAssemblies {
get {
var toReturn = base.ValueConverterAssemblies;
toReturn.Add(typeof(Cirrious.MvvmCross.Plugins.PictureChooser.Touch.MvxInMemoryImageValueConverter).Assembly);
return toReturn;
}
}
并且我通过 nuget 添加了 picturechooser 插件,这样我就有了必要的 bootstrap 代码。
我也试过这个:
set.Bind(imgPhoto).For("Bitmap").To(vm => vm.Bytes).WithConversion("InMemoryImage");
而且我也尝试过使用 MvxImageViewLoader 并绑定到它而不是直接绑定到 MvxImageView,但也没有任何乐趣。
最后我也尝试在主线程上调用 PictureChooserTask,但也没有用。
感谢您的帮助!
在 UIImageView
上,属性 被称为 Image
,您必须像这样绑定:
set.Bind(imgPhoto).For(v => v.Image).To(vm => vm.Bytes).WithConversion("InMemoryImage");
默认绑定 属性 是 ImageUrl
。但是 MvxInMemoryImageValueConverter
转换为 UIImage
。这就是为什么它必须绑定到 Image
.
我正在构建一个跨平台的 Xamarin 解决方案,使用单独的 iOS / android 项目和共享 PCL 包含使用 MVVM 交叉编写的视图模型(版本 3.5.1框架和插件)。
我正在使用 iOS 设备相机拍照并将值存储在字节变量中,如下所示:
private byte[] _bytes;
public byte[] Bytes {
get { return _bytes; }
set {
_bytes = value;
RaisePropertyChanged (() => Bytes);
}
}
public void TakePhoto ()
{
var task = Mvx.Resolve<IMvxPictureChooserTask> ();
task.TakePicture (500, 90,
stream => {
var memoryStream = new MemoryStream ();
stream.CopyTo (memoryStream);
Bytes = memoryStream.ToArray ();
},
() => {
// perform any cancelled operation
});
}
单击绑定按钮时相机会正确打开,并允许我拍照,但是 UI 中的图像视图在我 select 到 [=50] 后没有更新=] 我拍的照片。
这是我的绑定:
set.Bind(imgPhoto).To(vm => vm.Bytes).WithConversion("InMemoryImage");
set.Bind (btnTakePhoto).To ("TakePhoto");
imgPhoto 在哪里
public MvxImageView imgPhoto { get; set; }
而 btnTakePhoto 是
public UIButton btnTakePhoto { get; set; }
(我已尽力遵循 youtube 上 MVVMcross N+17 教程中使用的绑定语法 -(Stuart,如果您正在回答这个问题,谢谢!)
它在 android 上运行良好,使用相同的视图模型代码并像这样绑定到视图:
local:MvxBind="Bitmap Bytes, Converter=InMemoryImage; Visible Bytes;"
我在应用程序的设置 class 中添加了用于内存转换的引用程序集(我不必为 android 执行此操作):
protected override List<Assembly> ValueConverterAssemblies {
get {
var toReturn = base.ValueConverterAssemblies;
toReturn.Add(typeof(Cirrious.MvvmCross.Plugins.PictureChooser.Touch.MvxInMemoryImageValueConverter).Assembly);
return toReturn;
}
}
并且我通过 nuget 添加了 picturechooser 插件,这样我就有了必要的 bootstrap 代码。
我也试过这个:
set.Bind(imgPhoto).For("Bitmap").To(vm => vm.Bytes).WithConversion("InMemoryImage");
而且我也尝试过使用 MvxImageViewLoader 并绑定到它而不是直接绑定到 MvxImageView,但也没有任何乐趣。
最后我也尝试在主线程上调用 PictureChooserTask,但也没有用。
感谢您的帮助!
在 UIImageView
上,属性 被称为 Image
,您必须像这样绑定:
set.Bind(imgPhoto).For(v => v.Image).To(vm => vm.Bytes).WithConversion("InMemoryImage");
默认绑定 属性 是 ImageUrl
。但是 MvxInMemoryImageValueConverter
转换为 UIImage
。这就是为什么它必须绑定到 Image
.