2013-05-07 2 views
0

Я зарегистрирован в OnSizeChanged случае моей страницы, как это:Как отключить приложение Snap?

private void OnSizeChanged(object sender, SizeChangedEventArgs e) 
{ 
    ApplicationViewState myViewState = ApplicationView.Value; 
    if (myViewState == ApplicationViewState.Snapped) 
    { 
     Windows.UI.ViewManagement.ApplicationView.TryUnsnap();     
    } 
} 

Я Tyring установить приложение-вид Заполненные/состояние портретной при попытке пользователя (вручную ....), чтобы изменить размер это, чтобы щелкнуть вид. , но метод TryUnsnap терпит неудачу и он остается в состоянии фиксации ...

Помощь!

Спасибо.

+0

Это вежливо отметить лучший ответ. –

ответ

0
  var CurrentSnappedState = ApplicationView.Value; 
      if (CurrentSnappedState == ApplicationViewState.Snapped && !ApplicationView.TryUnsnap()) 
      { 
       return; 
      } 

Должен сделать трюк. Помните, что вы все еще можете привязать страницу, но когда вы пытаетесь сделать что-либо на странице с привязкой, вы будете перенаправлены на fullview.

+0

Я не понимаю. Снова он не может отменить ... Я хочу установить состояние в положение «Портрет»/«Заполнено» в тот момент, когда пользователь перетаскивает и отключает приложение. –

+0

Вы всегда можете установить событие GotFocus на заблокированную страницу и ввести там код. – NiklasHansen

3

Чтобы понять TryUnsnap() мы должны понимать 2 типа Windows, 8 событий:

  1. алгоритмического событие

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

  2. инициированные пользователем события

    инициированные пользователем события требуют от пользователя, чтобы сделать что-то. Например, событие 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); 
} 

Удачного дня и удачи!

+0

Возможно ли, что, когда пользователь открывает страницу, он мгновенно перенаправляется на FullView? Я попытался настроить событие GotFocus на привязанной странице на ApplicationView.TryUnsnap(). Но, похоже, он работает 1/5 раз, когда я его хватаю. – NiklasHansen

+0

Святое дерьмо, мужик, ты даже читал то, что я написал? И я цитирую: «Вы хотите перейти от« Зарезервировано до заполненного », как только приложение будет отключено. Событие, поднятое из действия Snapped, является программным событием. В результате вы должны сначала заманить пользователя в том, чтобы что-то делать в своем пользовательском интерфейсе. «Итак, вы не можете делать то, что вы просите. Вы не можете Unsnap(), пока пользователь не будет каким-либо образом взаимодействовать с вашим приложением. –

+0

Хорошо, спасибо. Сожалею. – NiklasHansen

Смежные вопросы