2016-08-15 16 views
0

Windows 10でUniversalアプリケーションの '確定的な' ProgressRingを作成しようとしていて、StateTriggerを使用して問題が発生しました。アクティブ化後、以前のVisualStateに戻りませんが、代わりにnullに戻ります。私はこれが期待される行動ではないと思います。アニメーションはトリガされたときに正しく発生しますが、アニメーションが戻るときには発生しません。とにかくOnApplyTemplateの間に正常に発生するコードから...GoToState(..., "Running", ...)が呼び出されると、期待どおりにアニメーション化されます。StateTriggerは以前のVisualStateに戻りませんか?

私が試みた:(驚くほど)To="Stopped"時動作

<VisualStateGroup.Transitions> 
    <VisualTransition From="{x:Null}" To="Stopped" GeneratedDuration="0:0:1" /> 
    <VisualTransition From="Stopped" To="{x:Null}" GeneratedDuration="0:0:1" /> 
</VisualStateGroup.Transitions> 

、以下のコードと同じではなく、逆中。

私はこれがコードではなくXAMLで機能するようにしたいと考えています。 DotNetのバグか私のせい?そして私はそれをどのように修正するのですか?手動で「実行中」の状態に戻す必要がありますか? ControlTemplateの中に表示されるコード、:

<VisualStateGroup x:Name="States"> 
    <VisualStateGroup.Transitions> 
     <VisualTransition GeneratedDuration="0:0:1" /> 
    </VisualStateGroup.Transitions> 
    <VisualState x:Name="Running" /> 
    <VisualState x:Name="Stopped"> 
     <VisualState.StateTriggers> 
      <StateTrigger IsActive="{Binding ShowPaused, RelativeSource={RelativeSource TemplatedParent}}" /> 
     </VisualState.StateTriggers> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="PART_Indicator" 
          Storyboard.TargetProperty="(UIElement.Opacity)" 
          To="{ThemeResource ProgressBarIndicatorPauseOpacity}"/> 
     </Storyboard> 
    </VisualState> 
</VisualStateGroup> 

答えて

2

あなたはコードビハインドでVisualStateManager.GoToState methodを使用し、あなたのアニメーション作品。これは、GoToStateメソッドでは、状態を遷移先に指定しているため、VisualStateManagerシステムはVisualTransitionに従ってどのアニメーションを実行するかを知っているからです。

XAMLでは、特定のVisualStateが適用される時期を指定するのにStateTrigger classを使用しています。 StateTrigger.IsActive propertytrueですが、VisualStateManagerシステムではVisualStateが適用されます。 VisualStateManagerシステムは遷移する状態を知っているので、アニメーションが実行されます。ただし、StateTrigger.IsActiveプロパティはfalseですが、コントロールの状態の変更はただ削除され、異なるVisualStateの間の変更はトリガーされません。

サンプルでは、​​が「停止」になりますが、StateTrigger.IsActivefalseの場合はアニメーションがありません。この問題を解決するには、我々は次のようにInvertBoolConverterと「実行」状態のVisualState.StateTriggersを設定することができます。

public class InvertBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     var boolValue = (bool)value; 
     return !boolValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     var boolValue = (bool)value; 
     return !boolValue; 
    } 
} 

そして「実行」状態にある:

<VisualState x:Name="Running"> 
    <VisualState.StateTriggers> 
     <StateTrigger IsActive="{Binding ShowPaused, Converter={StaticResource InvertBoolConverter}, RelativeSource={RelativeSource TemplatedParent}}" /> 
    </VisualState.StateTriggers> 
</VisualState> 

From値の参照、VisualTransitionで、ほか現在の状態である状態の名前。 Toの値は、新しい状態である状態の名前を参照します。また、VisualTransitionは、Fromの状態、ちょうどToの状態、またはFromToの状態の両方を参照できます。 FromまたはToのいずれかを省略すると、どの状態にもなります。したがって、FromToの両方の状態を設定したくない場合は、{x:Null}に設定するのではなく、1つを省略することができます。

<VisualStateGroup.Transitions> 
    <VisualTransition To="Stopped" GeneratedDuration="0:0:1" /> 
    <VisualTransition From="Stopped" GeneratedDuration="0:0:1" /> 
</VisualStateGroup.Transitions> 
+0

'VisualStateGroup.Transitions'は' InvertBoolConverter'なしで動作すると予想されますか?それはデフォルトの ''を使うこととどう違うのですか?私の場合は 'InvertBoolConverter'がなくとも動作しません。私はまだ 'InvertBoolConverter'が必要な理由を理解していません。' 'それを気にするべきではありませんか? –

+0

@TimRawlinsonあなたの場合、 'InvertBoolConverter'が必要です。 VisualStateManagerシステムは、 'VisualState'が変更されたことを知る必要があるので、' VisualTransition'に従ってアニメーションを実行できます。 "Runing"に 'StateTrigger'を設定しないと、' ShowPaused'が 'false'のときに' VisualState'の変更はありません。これは、 'StateTrigger.IsActive'プロパティが' false'であるときに、コントロールの状態の変更を削除し、 'VisualState'の変更をトリガーしないためです。 –

関連する問題