在Windows Phone 8.1上,我使用的是Caliburn.Micro视图模型优先方法,但由于视图模型不能了解视图,我无法看到如何将MediaCapture对象绑定到CaptureElement中。图。
答案 0 :(得分:8)
我遇到了同样的问题。我在Windows Phone 8.1 WinRT(通用应用程序)中使用MVVM Light。
我使用了ContentControl并绑定到CaptureElement:
<ContentControl HorizontalAlignment="Left"
Width="320" Height="140" Content="{Binding CaptureElement}"/>
CaptureElement和MediaCapture是我的ViewModel中的属性:
private MediaCapture _mediaCapture;
public MediaCapture MediaCapture
{
get
{
if (_mediaCapture == null) _mediaCapture = new MediaCapture();
return _mediaCapture;
}
set
{
Set(() => MediaCapture, ref _mediaCapture, value);
}
}
private CaptureElement _captureElement;
public CaptureElement CaptureElement
{
get
{
if (_captureElement == null) _captureElement = new CaptureElement();
return _captureElement;
}
set
{
Set(() => CaptureElement, ref _captureElement, value);
}
}
然后我在ViewModel的构造函数中调用ConfigureMedia():
async void ConfigureMedia()
{
await MediaCapture.InitializeAsync();
CaptureElement.Source = MediaCapture;
await MediaCapture.StartPreviewAsync();
}
首先初始化MediaCapture很重要,接下来设置Source,最后是StartPeview。对我来说它有效:)
答案 1 :(得分:1)
如果你试图保持严格的视图/视图模型分离,那么有几种可能性。
您是否尝试过直接绑定?
<CaptureElement Source="{Binding SomeMediaCapture}" />
如果那不起作用,另一个人就是创建你自己的附加属性,你可以把它放在CaptureElement上。设置该属性后,您可以自己设置源。
<CaptureElement custom:CaptureHelper.Source="{Binding SomeMediaCapture}" />
Here's a sample使用网页视图进行类似操作并创建html绑定。
我倾向于这样做的方法是创建一个界面来抽象视图实现的视图(比如ICaptureView)。
然后我可以投射视图模型所持有的视图
var captureView = (ICaptureView) GetView();
其中ICaptureView实现了SetCaptureSource方法。这样它仍然是可测试的,因为您可以将模拟ICaptureView附加到视图模型进行测试。
答案 2 :(得分:1)
根据Hawlett的回答,我必须多做一点才能让相机正确显示。我已将ConfigureMedia()更改为:
private async void ConfigureMedia()
{
_deviceInformationCollection = await DeviceInformation.FindAllAsync(DeviceClass.VideoCapture);
await MediaCapture.InitializeAsync(new MediaCaptureInitializationSettings
{
VideoDeviceId = _deviceInformationCollection[_deviceInformationCollection.Count - 1].Id
// The rear-facing camera is the last in the list
});
MediaCapture.VideoDeviceController.PrimaryUse = CaptureUse.Photo;
MediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
CaptureElement.Source = MediaCapture;
CaptureElement.Stretch = Stretch.UniformToFill;
await MediaCapture.StartPreviewAsync();
}
答案 3 :(得分:0)
我使用了ContentControl
并绑定到CaptureElement
,它对我有用,但只是第一次。如果我导航到另一个页面并且我回到相机的页面,我将无法看到相机预览。我没有将方法称为StopPreviewAsync()
我只导航到另一个页面。