2012-07-30 11 views
5

Mam aplikację Silverlight 4, w której mam określone stany zdefiniowane w XAML i używam VisualStateManager.GoToState(this, "stateName", false), która działa zgodnie z oczekiwaniami.Jak odświeżyć bieżący stan za pomocą VisualStateManager

Problem polega jednak na tym, że niektóre właściwości stanu są powiązane z interfejsem użytkownika, aby użytkownik mógł dostosowywać takie elementy, jak kolor. Można to zrobić w tym stanie (powiedzmy, stan A). Zmiany nie są odzwierciedleniem, dopóki nie przejdę do innego stanu, a następnie z powrotem do stanu A. Problemem nie jest powiązanie z interfejsu do właściwości bazowych (mają oczekiwane wartości), ale stan musi zostać odświeżony - lub przynajmniej taki jest mój wniosek.

Najpierw próbowałem po prostu VisualStateManager.GoToState(this, "StateA", false), ale okazało się, że "if the control is already in the stateName state, GoToState takes no action returns true".

Potem próbowali bez powodzenia, chociaż nie jest to naprawdę miłe rozwiązanie:

VisualStateManager.GoToState(this, "StateB", false); 
VisualStateManager.GoToState(this, "StateA", false); 

Czy ktoś wie jak mogę wymusić odświeżenie lub obejścia problemu?

AKTUALIZACJA: Udało mi się zmusić go do pracy z kombinacją poniższej odpowiedzi i użyciem następującego kodu po zmianie właściwości zależności. Wydaje się, że Storyboard.Stop() i Storyboard.Begin() uwzględniają nową wartość właściwości ustawionych z interfejsu użytkownika.

if (VisualStateManager.GoToState(this, "StateA", false)) 
{ 
    VisualState stateA = (VisualState)VisualStateGroup.States[0]; 
    stateA.Storyboard.Stop(); 
    stateA.Storyboard.Begin(); 
} 

Odpowiedz

4

Kod ten powinien działać:

VisualStateManager.GoToState(this, "StateB", false); 
VisualStateManager.GoToState(this, "StateA", false); 

To jest typowy Silverlight/WPF sposób zmusić odświeżania. Choć wydaje się być odrażający, widziałem dokładnie to samo podejście w kodzie narzędziowym Microsoft i Silverlight.

Przypuszczam, że kontrola nie została jeszcze załadowana lub nie wywołujesz zmiany stanu po zmianie właściwości.

trzeba zrobić dwie rzeczy:

  1. W OnApplyTemplate lub załadowany zdarzenia kontrolki, połóż kontroli do właściwego stanu. DependencyProperties są często aktualizowane przed faktycznym zakończeniem ładowania szablonów. W tym scenariuszu, nawet jeśli nazwiesz GoToState, nie ma szablonu, więc nic nie zrobi, ponieważ nie ma szablonu.

  2. Upewnij się, że w module obsługi zmiany właściwości dla właściwości zależności wywołujesz zmiany stanu.

Dla odwoływać, to zarejestrować obsługi PropertyChanged tak:

public static readonly DependencyProperty MinValueProperty = 
     DependencyProperty.Register("MinValue", typeof(double), typeof(ScaleValueConverter), new PropertyMetadata(0.0d,OnMinValuePropertyChanged)); 
1

W UWP XAML tylko wymienić de VisualStateGroup:

<VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="PopupStates"> 
       <VisualState x:Name="Mobile"> 
        <VisualState.StateTriggers> 
         <AdaptiveTrigger MinWindowWidth="0"/> 
        </VisualState.StateTriggers> 

i odświeżyć stan idzie:

VisualStateManager.GoToState(this, PopupStates.CurrentState.Name, false); 
Powiązane problemy