Чтобы понять TryUnsnap() мы должны понимать 2 типа Windows, 8 событий:
алгоритмического событие
алгоритмические события не требуют, чтобы пользователя сделать что-нибудь. Например, событие «Загружено» страницы или событие «Тик» таймера.
инициированные пользователем события
инициированные пользователем события требуют от пользователя, чтобы сделать что-то. Например, событие Click кнопки или событие Tapped элемента управления.
Важной частью
В зависимости от типа события, только некоторые Windows 8 API, можно назвать. Например, добавление вторичной плитки. И (как вы могли догадаться) un-Snapping приложение.
Это означает, что вы можете называть эти API все, что вы хотите от программных событий, но они никогда не будут доставлять желаемые результаты. Unsnap в событии StateChanged, и по этой причине произойдет сбой. Unsnap в событии Button.Click, и это пойдет по этой причине.
Основой такого поведения является пользовательский интерфейс. Если приложение может изменить его «ориентацию» на пользователя без взаимодействия пользователя, то поведение приложения становится как запутанным, так и непредсказуемым. Windows 8 - это профессиональная операционная система. Когда вы обнаруживаете ограничения разработчика, в 99% случаев это составляет эту философию.
Позвольте мне продемонстрировать:
Если вы прикреплены к событию StateChanged, ваш код будет выглядеть следующим образом:
this.ApplicationViewStates.CurrentStateChanged += (s, args) =>
{
System.Diagnostics.Debug.WriteLine("After StateChanged: {0}", this.ApplicationViewStates.CurrentState.Name);
if (this.ApplicationViewStates.CurrentState == this.Snapped)
{
System.Diagnostics.Debug.WriteLine("Before Unsnap: {0}", this.ApplicationViewStates.CurrentState.Name);
Unsnap();
}
};
Однако полученный вывод (в отладчике) будет выглядеть следующим образом :
After StateChanged: FullScreenLandscape
After StateChanged: Snapped
Before Unsnap: Snapped
After TryUnsnap: Snapped
Это неудобно для разработчика, который не понимает разницу между программный и инициированный пользователем события в Windows 8. API, похоже, «не работает», когда на самом деле он отлично работает. Просто не так, как они этого хотят.
Если вы привязаны к замковое случае, ваш код будет выглядеть следующим образом:
MyButton.Click += (s, args) =>
{
System.Diagnostics.Debug.WriteLine("After Button.Click: {0}", this.ApplicationViewStates.CurrentState.Name);
if (this.ApplicationViewStates.CurrentState == this.Snapped)
{
System.Diagnostics.Debug.WriteLine("Before Unsnap: {0}", this.ApplicationViewStates.CurrentState.Name);
Unsnap();
}
};
Затем полученный результат будет выглядеть следующим образом:
After Button.Click: Snapped
Before Unsnap: Snapped
After TryUnsnap: Snapped
After StateChanged: FullScreenLandscape
Это заставляет вас, что вы хотите, но это поднимает важный момент. Посмотрите, как после TryUnsnap состояние REMAINS «Snapped»? Переход визуального состояния от одного к другому не является синхронным событием. Призыв к изменению требует непредсказуемого количества времени. Это, вероятно, сделано с отправкой почты, но я должен был проверить, чтобы быть уверенным.
Сказав это, государство делает изменение. И после изменения происходит событие CurrentStateChanged, и вы можете обработать новое состояние Snapped. Кстати, не имеет значения, есть ли другое приложение, которое работает, это работает в любом случае.
Документы MSDN говорят, что он работает только в том случае, если он находится на переднем плане. Это довольно глупо, поскольку взаимодействие с пользователем не может происходить в фоновом приложении, а фоновые приложения в любом случае приостановили свои потоки. Но, если быть честным с MSDN, этот API не работает, когда ваше приложение находится в фоновом режиме - что бы это ни стоило.
Я надеюсь, что это поможет очистить его.
А теперь к вашему вопросу:
Вы хотите перейти от привязываются к ПТИЦЕ? Конечно, в Portrait, Snapped невозможно, поэтому вы не можете кодировать код. Вы хотите перейти от «Отключено» до «Заполнено», как только приложение будет отключено. Событие, поднятое из действия Snapped, является программным событием. В результате вы должны сначала заманить пользователя в выполнение чего-то в своем интерфейсе. Итак, нет, вы не можете делать то, что вы просите. Вы не можете Unsnap(), пока пользователь не будет каким-либо образом взаимодействовать с вашим приложением (например, событие нажатия кнопки).
О, и вот метод Unsnap(), если вы хотите ссылаться на весь мой код. Я не делаю ничего особенного, но вам может быть интересно:
void Unsnap()
{
if (Windows.UI.ViewManagement.ApplicationView.TryUnsnap())
// successfully unsnapped
System.Diagnostics.Debug.WriteLine("After TryUnsnap: {0}", this.ApplicationViewStates.CurrentState.Name);
else
// un-successfully unsnapped
System.Diagnostics.Debug.WriteLine("After TryUnsnap: {0}", this.ApplicationViewStates.CurrentState.Name);
}
Удачного дня и удачи!
Это вежливо отметить лучший ответ. –