かなり複雑なカスタムコントロールがあり、すべてのコードを表示すると頭がおかしくなります。;)一般的に、それは複数のコントロールを表示するパネルです。カスタムリストボックスと考えることができます。(リストボックスを使用するように言わないでください。私はそこに行ったことがありますが、それは私のニーズを完全には満たしていません)。
そこで、VisualStateManagerでいくつかのアニメーションを設定しました。何が起こるかです:
- 子コントロールの1つにカーソルを合わせると、MouseOver状態が発生することを期待しています。します。
- 子コントロールの1つを選択すると、 Selected状態が起動することを期待しています。
- 別の子コントロールを選択すると、 Selected状態も発生します
- 選択した最初の子コントロールに戻って選択すると、Selected状態が起動するように表示されますが(コードのデバッグステートメントによって)、MouseOverアニメーションが表示されます。
どういうわけかオーバーライドできるアニメーションに問題がありますか、または私が気付いていないマウスオーバーと選択された状態の間の問題がありますか?
これが私のVSMマークアップです:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="00:00:00.150000" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="DarkGray"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="00:00:00.150000" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="Yellow"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectedStates">
<VisualState x:Name="Unselected">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="1" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="Purple"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Selected">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="0" Duration="1" Storyboard.TargetName="Backdrop" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="0" Value="Green"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
そして、これが私のGoToState()ロジックです:
private void GoToState(bool useTransitions){TestingVariables( "Inside GoToState");
if (_isSelected)
{
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Selected VSM");
VisualStateManager.GoToState(this, "Selected", useTransitions);
}
else if (_wasSelected)
{
_wasSelected = false;
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Unselected");
VisualStateManager.GoToState(this, "Unselected", useTransitions);
}
else if (_isMouseOver)
{
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing MouseOver VSM");
VisualStateManager.GoToState(this, "MouseOver", useTransitions);
}
else
{
System.Diagnostics.Debug.WriteLine(_thumbnail.ShortFileName + " firing Normal VSM");
VisualStateManager.GoToState(this, "Normal", useTransitions);
}
}
したがって、どのVisualStateManger.GoToState()メソッドが起動されるかを確認でき、TestingVariables()の呼び出しは、起動するビジュアル状態を決定するために使用している条件付きフラグを書き出すために使用するメソッドにすぎません。
前もって感謝します。