如何使用Caliburn.Micro将源MediaCapture绑定到CaptureElement?

时间:2014-05-26 22:45:32

标签: mvvm caliburn.micro windows-phone-8.1

在Windows Phone 8.1上,我使用的是Caliburn.Micro视图模型优先方法,但由于视图模型不能了解视图,我无法看到如何将MediaCapture对象绑定到CaptureElement中。图。

4 个答案:

答案 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()我只导航到另一个页面。