Отображение содержимого за SystemTray в WP8 / 8.1 Silverlight (полноэкранный фон с видимым и прозрачным SystemTray)

У меня вопрос по Windows Phone 8 / 8.1 Silverlight.

Я пытаюсь применить полноэкранный фон к PhoneApplicationPage, но когда я это делаю, SystemTray блокирует представление.

Я пытаюсь добиться чего-то вроде этого:

Офисное приложение по умолчанию в WP8 Silverlight

Как видите, приложение Office по умолчанию на Windows Phone 8 (эмулятор) имеет прозрачный фон и логотип офиса за ним. Как я могу этого добиться?

Я не хочу скрывать SystemTray, потому что это будет очень неудобно для пользователя.

Я прошел через эта статья в блоге MSDN, но она касается универсальных приложений, поэтому упомянутые там API-интерфейсы недоступны.


person Shishir Gupta    schedule 29.07.2014    source источник


Ответы (2)


Что ты можешь сделать, это

  1. Примените поле 0,-32,0,0 к верхней части LayoutRoot сетки.
  2. Добавьте положительное поле 32 к существующему верхнему полю первого дочернего элемента (чтобы сбалансировать шаг 1).
  3. Установите SystemTray.Opacity = 0.001 (см. edit0) в событии OnLoaded страницы, чтобы сделать SystemTray прозрачным.

Это сдвинет всю сетку экрана вверх (и скроется за SystemTray). Затем установка непрозрачности SystemTray на 0,001 делает фон прозрачным.

Частичный код:

Шаг 1 и 2

<!--LayoutRoot is the root grid where all page content is placed-->

<Grid x:Name="LayoutRoot"
      Background="Transparent"

      Margin="0,-32,0,0"> <!-- Step 1 -->

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Rectangle Grid.Row="0" Grid.RowSpan="2">
        <Rectangle.Fill>
            <ImageBrush ImageSource="/Assets/SampleImage.png" />
        </Rectangle.Fill>
    </Rectangle>
    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel Grid.Row="0"

                Margin="12,49,0,28"> <!--Step 2. (default Margin="12,17,0,28")-->

        <TextBlock Text="{Binding Path=LocalizedResources.ApplicationTitle, Source={StaticResource LocalizedStrings}}"
                   Style="{StaticResource PhoneTextNormalStyle}" />
        <TextBlock Text="lel k"
                   Margin="9,-7,0,0"
                   Style="{StaticResource PhoneTextTitle1Style}" />
    </StackPanel>
    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel"
          Grid.Row="1"
          Margin="12,0,12,0">
    </Grid>
</Grid>

Шаг 3

public partial class Page1: PhoneApplicationPage
{
    // Constructor
    public Page1()
    {
        InitializeComponent();
        Loaded += Page1_Loaded;
        //...
    }

    void Page1_Loaded(object sender, RoutedEventArgs e)
    {
        SystemTray.Opacity = 0.001; // see edit0
    }
}

И готово! Удачного кодирования :)

edit0:

Похоже, что настройка SystemTray.Opacity = 0.0 скрывает индикатор заряда батареи и сигнал сотовой связи. Изменение его на SystemTray.Opacity = 0.001 устраняет проблему.

person Shishir Gupta    schedule 29.07.2014

В блоге есть два отличных сообщения (очень скромное хвастовство) о расширении темы вашего приложения на панели задач:

Чтобы выполнить то, что вы хотите, просто измените Непрозрачность SystemTray на любое значение меньше 1. В результате все содержимое переместится в лоток. Оттуда вы можете поиграть с Фоном или Непрозрачностью, чтобы поддержать желаемый цвет. Если вы просто хотите, чтобы он был полностью прозрачным, установите для параметра Непрозрачность значение 0. Однако у него будет неблагоприятное воздействие на Windows Phone 8.1.

person Shawn Kendrot    schedule 29.07.2014
comment
Установка непрозрачности на 0,001 решает негативное влияние на WP8.1 :) - person Shishir Gupta; 31.07.2014
comment
Да, но это функциональное изменение с 8 до 8.1, и поэтому оно должно быть исправлено MS. - person Shawn Kendrot; 31.07.2014
comment
Да, они должны, я просто говорил для тех, кто прочитал ваш ответ и застрял с проблемой непрозрачности = 0 - person Shishir Gupta; 31.07.2014