在Windows Phone 8.1中设置CaptureElement宽度以填充父区域

时间:2015-05-10 16:32:35

标签: windows-phone-8.1 winrt-xaml contentcontrol image-capture

关注此帖:How can I bind source MediaCapture to CaptureElement using Caliburn.Micro?我尝试构建自己的照片捕获Windows Phone 8.1 WinRT应用。但即使我将ContentControl的水平和垂直内容对齐设置为拉伸,我的CaptureElement也非常小(大约100px / 80px)。

这是我的xaml

<Grid Margin="0,20,0,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <ContentControl Content="{Binding CaptureElement}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="0,20" Grid.Row="0"
                                        HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
                                        Visibility="{Binding IsInCaptureMode, Converter={StaticResource BoolToVisibilityConverter}}"/>


        <Button Grid.Row="1" Content="Take" Command="{Binding TakePhotoCommand}"
                                Visibility="{Binding IsInCaptureMode, Converter={StaticResource BoolToVisibilityConverter}}"/>
</Grid>

这是我的ViewModel

public MediaCapture MediaCapture
        {
            get
            {
                return this.mediaCapture;
            }

            set
            {
                this.mediaCapture = value;
                this.RaisePropertyChanged(() => this.MediaCapture);
            }
        }

        public CaptureElement CaptureElement
        {
            get
            {
                return this.captureElement;
            }

            set
            {
                this.captureElement = value;
                this.RaisePropertyChanged(() => this.CaptureElement);
            }
        }

private async void ConfigureMediaCapture()
        {
            this.MediaCapture = new MediaCapture();
            await this.MediaCapture.InitializeAsync();
            this.MediaCapture.SetPreviewRotation(VideoRotation.Clockwise90Degrees);
            this.CaptureElement.Source = MediaCapture;
            this.IsInCaptureMode = false;
        }

当我尝试更改CaptureElement的属性时,CaptureElement的高度就像我的设备屏幕,所以它没问题,但宽度仍然是大约80~100像素。

this.CaptureElement = new CaptureElement
       {
          HorizontalAlignment = HorizontalAlignment.Stretch,
          VerticalAlignment = VerticalAlignment.Stretch,
          Stretch = Stretch.Fill,
       };

当我为ContentControl设置按钮或其他控件时,一切都还可以。按钮具有所有屏幕的宽度和高度,但CaptureElement没有。任何人都可以告诉我这里有什么问题,或者我必须设置什么,以改变CaptureElement的宽度。

2 个答案:

答案 0 :(得分:3)

我认为其中一个问题是您在SetPreviewRotation方法中使用ConfigureMediaCapture。如果我没记错的话,它不会设置预览的新宽高比,而是将新预览信箱放在非旋转宽高比内。

如果你想做轮换,那就是:

// Rotation metadata to apply to the preview stream (MF_MT_VIDEO_ROTATION)
Guid RotationKey = new Guid("C380465D-2271-428C-9B83-ECEA3B4A85C1");
var props = this.MediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview);
props.Properties.Add(RotationKey, rotationDegrees);
await this.MediaCapture.SetEncodingPropertiesAsync(MediaStreamType.VideoPreview, props, null);   

参考:http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh868174.aspx

我从Microsoft github页面获取了适用于Windows 10的通用Windows平台示例的代码,尽管很多代码仍然适用于Windows / Phone 8.x。

完整示例:http://aka.ms/2015buildgetpreviewframesample

答案 1 :(得分:0)

对不起maniek099,但你的应用程序是否有全屏摄像头预览?我尝试做同样的事情,但我的相机预览不是全屏,它小于屏幕高度。

由于  Alessio的