我是MVVMCross的新手,目前正在努力解决绑定问题。 尝试将视频的URL与Android中的VideoView组件绑定。
如果无法使用第一个选项,我会尝试获取网址并按照此处的说明播放视频:http://developer.xamarin.com/recipes/android/media/video/play_video/
提前致谢。
答案 0 :(得分:1)
MvvmCross非常灵活。您要求的不是内置的东西,但您可以轻松扩展MvvmCross以增加对它的支持。
MvvmCross拥有所谓的Binding Builders。这是您注册自定义目标绑定的位置。绑定采用类型,如 VideoView ,以及属性名称,如“ VideoUri”。
当MvvmCross看到如local:MvxBind="VideoUri MyVideoUri"
之类的绑定属性时,它将从 MyVideoUri 获取属性值,然后调用自定义绑定,该绑定最终将调用videoView.SetVideoURI()
。
以下是您需要采取的步骤。
1)在Android项目中,编辑 Setup.cs 并添加以下内容,以注册自定义绑定构建器。
protected override MvxAndroidBindingBuilder CreateBindingBuilder()
{
return new MyAndroidBindingBuilder();
}
2)创建一个自定义绑定构建器,该构建器是默认Android绑定构建器的子类:
public class MyAndroidBindingBuilder : MvxAndroidBindingBuilder
{
protected override void FillTargetFactories(IMvxTargetBindingFactoryRegistry registry)
{
base.FillTargetFactories(registry);
registry.RegisterCustomBindingFactory<VideoView>("VideoUri",
videoView => new MvxVideoViewUriTargetBinding(videoView));
}
}
3)为VideoView和属性“VideoUri”创建自定义目标绑定:
public class MvxVideoViewUriTargetBinding : MvxAndroidTargetBinding
{
public MvxVideoViewUriTargetBinding(object target) : base(target)
{
}
public override Type TargetType
{
get { return typeof (string); }
}
protected override void SetValueImpl(object target, object value)
{
var videoView = (VideoView) target;
videoView.SetVideoURI(Uri.Parse((string)value));
}
}
要在布局中使用它,只需创建以下内容:
1)在 layout.xml
中<VideoView
android:id="@+id/SampleVideoView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
local:MvxBind="VideoUri MyVideoUri" />
2)在 ViewModel 中,为MyVidoeUri添加属性
public string MyVideoUri
{
get { return "http://ia600507.us.archive.org/25/items/Cartoontheater1930sAnd1950s1/PigsInAPolka1943.mp4"; }
}
3)在您查看中,您可以像这样开始播放视频:
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.MyLayout);
// SetVideoURI() already called via binding
var videoView = FindViewById<VideoView>(Resource.Id.SampleVideoView);
videoView.Start();
}
查看MvxAndroidBindingBuilder的源代码以查看当前绑定。 https://github.com/MvvmCross/MvvmCross/blob/bbf9a2ac76e74d9404f4b57036c6e29dfe2cc6c3/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs
希望这有帮助。