Snap-заглушка (WinRT/Win8)

Состояние Snapped — одно из возможных состояний Windows Store App. В нем у приложения устанавливается ширина в 320 пикселей, а всю остальную ширину занимает другое приложение. Пользователь таким образом может работать одновременно с двумя приложениями. Данный режим поддерживается только на устройствах экран у которых имеет разрешение по горизонтали не менее 1366 пикселей.

На MSDN есть хороший пример, как можно поддерживать данный режим.

Если времени или желания нет, то можно сделать заглушку, которая полностью перекрывает экран на время нахождения приложения в состояние Snapped.
snap-заглушка
Заглушка состоит из цветного фона и картинки по середине.

Ниже приведен код, который создает заглушку на странице (для примера взят MainPage) :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
  
        //конструктор страницы
        public MainPage()
        {
            this.InitializeComponent();
 
            //подписываемся на изменение размера области страницы
            SizeChanged += OnSizeChanged;
        }
 
        //флаг о нахождение в состояние Snapped
        private bool _inSnapped;
 
        private void OnSizeChanged(object sender, SizeChangedEventArgs e)
        {
            //если перешли в Snapped
            if (ApplicationView.Value == ApplicationViewState.Snapped && !_inSnapped)
            {
                _inSnapped = true;
                InSnap();
            }
 
            //если вышли из Snapped
            if (ApplicationView.Value != ApplicationViewState.Snapped && _inSnapped)
            {
                _inSnapped = false;
                OutSnap();
            }
        }
 
        //установка заглушки
        private void InSnap()
        {
                //скрываем бары и блокируем бары
                AppBarsIsVisible(false);
 
                //находим корневой грид
                var rootGrid = Content as Grid;
                if (rootGrid != null)
                {
                    //создаем грид заглушки
                    var stubGrid = new Grid
                    {
                        Name = "snap_stub",
                        Background = new SolidColorBrush(Colors.Blue)
                    };
                    //создаем картинку
                    var stubImage = new Image
                    {
                        //для примерa Logo.png
                        Source = new BitmapImage(new Uri("ms-appx:/Assets/Logo.png", UriKind.RelativeOrAbsolute)),
                        VerticalAlignment = VerticalAlignment.Center,
                        HorizontalAlignment = HorizontalAlignment.Center
                    };
 
                    //добавляем нашу заглушку на корневой грид
                    stubGrid.Children.Add(stubImage);
                    rootGrid.Children.Add(stubGrid);
 
                    //растягиваем ее на всю область страницы
                    Grid.SetColumnSpan(stubGrid, 99);
                    Grid.SetRowSpan(stubGrid, 99);
                }
        }
 
        //удаление заглушки
        private void OutSnap()
        {
                //восстанавливаем бары
                AppBarsIsVisible(true);
 
                var rootGrid = Content as Grid;
                if (rootGrid != null)
                {
                    //находим грид заглушки
                    var stubGrid =
                        rootGrid.Children.FirstOrDefault(a => ((a is Grid) && (a as Grid).Name == "snap_stub"));
                    //если он был, то удаляем его
                    if (stubGrid != null)
                        rootGrid.Children.Remove(stubGrid);
                }
 
        }
 
        //настройка видимости баров
        private void AppBarsIsVisible(bool isVisible)
        {
            //верхнего
            if (TopAppBar != null)
                TopAppBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
 
            //и нижнего
            if (BottomAppBar != null)
                BottomAppBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
        }
  
        //конструктор страницы
        public MainPage()
        {
            this.InitializeComponent();

            //подписываемся на изменение размера области страницы
            SizeChanged += OnSizeChanged;
        }

        //флаг о нахождение в состояние Snapped
        private bool _inSnapped;

        private void OnSizeChanged(object sender, SizeChangedEventArgs e)
        {
            //если перешли в Snapped
            if (ApplicationView.Value == ApplicationViewState.Snapped && !_inSnapped)
            {
                _inSnapped = true;
                InSnap();
            }

            //если вышли из Snapped
            if (ApplicationView.Value != ApplicationViewState.Snapped && _inSnapped)
            {
                _inSnapped = false;
                OutSnap();
            }
        }

        //установка заглушки
        private void InSnap()
        {
                //скрываем бары и блокируем бары
                AppBarsIsVisible(false);

                //находим корневой грид
                var rootGrid = Content as Grid;
                if (rootGrid != null)
                {
                    //создаем грид заглушки
                    var stubGrid = new Grid
                    {
                        Name = "snap_stub",
                        Background = new SolidColorBrush(Colors.Blue)
                    };
                    //создаем картинку
                    var stubImage = new Image
                    {
                        //для примерa Logo.png
                        Source = new BitmapImage(new Uri("ms-appx:/Assets/Logo.png", UriKind.RelativeOrAbsolute)),
                        VerticalAlignment = VerticalAlignment.Center,
                        HorizontalAlignment = HorizontalAlignment.Center
                    };

                    //добавляем нашу заглушку на корневой грид
                    stubGrid.Children.Add(stubImage);
                    rootGrid.Children.Add(stubGrid);

                    //растягиваем ее на всю область страницы
                    Grid.SetColumnSpan(stubGrid, 99);
                    Grid.SetRowSpan(stubGrid, 99);
                }
        }

        //удаление заглушки
        private void OutSnap()
        {
                //восстанавливаем бары
                AppBarsIsVisible(true);

                var rootGrid = Content as Grid;
                if (rootGrid != null)
                {
                    //находим грид заглушки
                    var stubGrid =
                        rootGrid.Children.FirstOrDefault(a => ((a is Grid) && (a as Grid).Name == "snap_stub"));
                    //если он был, то удаляем его
                    if (stubGrid != null)
                        rootGrid.Children.Remove(stubGrid);
                }

        }

        //настройка видимости баров
        private void AppBarsIsVisible(bool isVisible)
        {
            //верхнего
            if (TopAppBar != null)
                TopAppBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;

            //и нижнего
            if (BottomAppBar != null)
                BottomAppBar.Visibility = isVisible ? Visibility.Visible : Visibility.Collapsed;
        }

скачать пример