Настройка ширины CaptureElement для заполнения родительской области в Windows Phone 8.1

После этого сообщения: Как я могу привязать источник MediaCapture использовать CaptureElement с помощью Caliburn.Micro? Я попытался создать собственное приложение для захвата фотографий Windows Phone 8.1 WinRT. Но даже если я установил горизонтальное и вертикальное выравнивание содержимого ContentControl на растяжение, мой CaptureElement будет очень маленьким (около 100 пикселей/80 пикселей).

Вот мой 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.


person maniek099    schedule 10.05.2015    source источник


Ответы (2)


Я думаю, что одна из проблем заключается в том, что вы используете 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 для Windows 10, хотя большая часть кода по-прежнему применима к Windows/Phone 8.x.

Полный образец: http://aka.ms/2015buildgetpreviewframesample

person Mike    schedule 11.05.2015
comment
Большое спасибо, но в моей проблеме я установил для Stretch of CaptureElement значение UniformToFill, и теперь все работает нормально. Глупая оплошность. - person maniek099; 11.05.2015
comment
Да, я тоже это пропустил. Тем не менее, для ротации предварительного просмотра рекомендуется использовать подход метаданных. Взгляните на выступление команды оператора Channel 9, в которой говорится о ротации: channel9 .msdn.com/Events/Build/2015/2-730. Фрагмент кода, который я разместил здесь, представлен в видео примерно через 10:50 минут. - person Mike; 11.05.2015
comment
Большое спасибо, Майк. Я думаю, что это было бы полезно для меня в будущем. - person maniek099; 11.05.2015

Извините, maniek099, но ваше приложение имеет полноэкранный предварительный просмотр камеры или нет? Я пытаюсь сделать то же самое, но предварительный просмотр камеры не в полноэкранном режиме, он меньше высоты экрана.

Спасибо, Алессио.

person Kamax    schedule 22.08.2015
comment
Да, это не полноэкранный просмотр. Для полноэкранного предварительного просмотра я использовал FileOpenPicker с SuggestedStartLocation = PickerLocationId.PicturesLibrary. В этом вы можете выбрать файл или сделать новую стандартную фотографию Windows Phone. - person maniek099; 23.08.2015