Координаты Splashscreen Rect возвращают размеры экрана на Win 10 Mobile

Я пытаюсь создать расширенный SplashScreen в своем приложении UWP, для которого необходимы координаты изображения SplashScreen. Я использую следующий код в App.xaml.cs:

 protected override void OnLaunched(LaunchActivatedEventArgs e)
        {
            if (e.SplashScreen != null)
                var SplashLocation = e.SplashScreen.ImageLocation;
            //Rest of initialization...
        }

Однако, если я проверю SplashLocation, который является Rect, SplashLocation.Height и SplashLocation.Width, вернут 1280 и 768, что является размером экрана моего телефона. Все остальные свойства равны 0.

Это известная ошибка в Win 10 Mobile [сборка 10536]? Он отлично работает на настольной Windows 10.


person Saurabh3321    schedule 20.09.2015    source источник
comment
Заставка закрывает весь экран телефона?   -  person LegionMammal978    schedule 20.09.2015
comment
Нет. Я только что сделал свой спласкрин другого цвета, чем установленный цвет фона, чтобы проверить это. Заставка отображается как центрированное изображение.   -  person Saurabh3321    schedule 20.09.2015
comment
Вы нашли решение этой проблемы, у меня такая же проблема.   -  person KMan    schedule 13.10.2015
comment
Слава богу, я не сумасшедший! Ржунимагу. Да, я нашел обходной путь, который, кажется, работает почти нормально. Я опубликую его в ближайшее время.   -  person Saurabh3321    schedule 13.10.2015
comment
Это сработало для вас, @KMan?   -  person Saurabh3321    schedule 14.10.2015


Ответы (3)


На самом деле проблема в том, что код, указанный в документах MSDN, неверен. Вместо этого взгляните на их образцы на Github. Вы можете найти его здесь: Пример заставки

Обратите внимание на различия между документами MSDN и образцом:

  1. ExtendedSplash НЕ расширяет страницу
  2. Они используют ScaleFactor для телефона
  3. Корневой элемент XAML — это Grid, а не страница.

Я последовал их образцу (после нескольких часов размышлений), и все сработало хорошо. Я надеюсь, что они обновят свои документы, чтобы отразить правильную вещь.

person Saurabh    schedule 24.12.2015
comment
Хорошая находка. Вы пробовали версию MSDN на последней мобильной сборке? Я не пробовал это в недавней сборке, так как мой обходной путь все еще работает. Если это все еще не работает, причина должна быть в ScaleFactor. Я не понимаю, как «не расширение со страницы» должно иметь значение. - person Saurabh3321; 24.12.2015
comment
Я попробовал это на последней сборке, и она все еще не работает. Отсутствие расширения от Page работает с добавлением ExtendedSpash в качестве содержимого в RootFrame, что позволяет вам также контролировать цвет строки состояния. - person Saurabh; 25.12.2015

В качестве обходного пути, вот что я сделал:

Создайте Image в XAML внутри Grid (а НЕ внутри Canvas, как это предлагается в документах msdn)

    <Image Name="ExtSplash" 
           Stretch="Uniform" 
           HorizontalAlignment="Center"  
           VerticalAlignment="Center" 
           Source="Assets/Splash/SplashScreen.png"/>

Теперь хитрость заключается в том, чтобы заставить его работать как на мобильном устройстве (который не дает правильных координат Rect, так и на рабочем столе (который работает, как и ожидалось).

Итак, в загруженном событии Page в коде позади я использовал этот код:

    if (splash.Top < splash.Left)
        ExtSplash.Margin = new Thickness(splash.Top);
    else
        ExtSplash.Margin = new Thickness(splash.Left);

где Splash = e.SplashScreen.ImageLocation из события OnLaunched в App.xaml.cs.

Это работает, потому что Splash.Top и Splash.Left возвращают 0 в случае Mobile. Таким образом, приложение просто отображает заставку, полностью растянутую по ширине. В случае рабочего стола изображение может иметь некоторые левые или верхние координаты, поскольку они правильно отображаются на рабочем столе, где я установил их как Margin для выровненного по центру однородного растянутого изображения.

ПРИМЕЧАНИЕ 1. Могут быть случаи, когда между экраном-заставкой и изображением расширенной заставки могут возникать небольшие различия. Но в моем тесте он работал нормально. Он будет продолжать работать, даже если в более поздней сборке MS исправит проблему, поэтому вы можете не торопиться, чтобы реализовать стандартный метод тогда.

ПРИМЕЧАНИЕ 2. У меня были некоторые проблемы с этой логикой, если было предоставлено изображение заставки масштаба-400. По какой-то причине WM10 подхватывает самое высокое доступное разрешение. Поэтому я просто предоставил изображения в масштабе 100, 125, 150 и 200 (пропустил 400).

person Saurabh3321    schedule 13.10.2015

В итоге я отказался от подхода SplashScreen.ImageLocation. руководство Microsoft в настоящее время не работает на мобильных устройствах. написания, а пример является хакерским. Вместо этого я использовал простой макет, подобный этому, для расширенного экрана-заставки:

<Grid>
    <Image x:Name="splashScreenImage" Source="Assets/SplashScreen.png" MaxWidth="620" MaxHeight="300"/>
    <!-- plus some other control -->
</Grid>

Магия заключается в использовании MaxWidth/MaxHeight.

На мобильном устройстве изображение будет немного отличаться по вертикали (я думаю, из-за строки состояния и панели навигации), но в остальном правильно, включая размер. На рабочем столе изображение выглядит точно так же, как и исходная заставка.

person holmis83    schedule 23.02.2016
comment
можешь опубликовать свой PositionImage() ? - person ravi kumar; 28.06.2017
comment
@ravikumar Я больше не работаю с этим проектом, извините. - person holmis83; 30.06.2017