2017-02-19 15 views
0

ComboBoxItemの背景に簡単なアニメーション効果を、ComboBox要素に入れたいです。項目は、ポインタがその上にあるときに定義された色で強調表示され、ポインタが離れるとき元の状態に戻ります。`ComboBoxItem`sのアニメーションによるハイライト効果

これは私が進むべき道であるトリガー勘を持っている私のテンプレート

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
       <Border x:Name="Border" 
         Padding="2" 
         SnapsToDevicePixels="true"> 
        <Border.Style> 
         <Style TargetType="{x:Type Border}"> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="True"> 
            <Trigger.EnterActions> 
             <BeginStoryboard> 
              <Storyboard> 
               <ColorAnimation Duration="0:0:0.01" 
                   Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" 
                   To="#FFA7ACD4" /> 
              </Storyboard> 
             </BeginStoryboard> 
            </Trigger.EnterActions> 
            <Trigger.ExitActions> 
             <BeginStoryboard> 
              <Storyboard> 
               <ColorAnimation Duration="0:0:0.6" 
                   Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" 
                   To="White" /> 
              </Storyboard> 
             </BeginStoryboard> 
            </Trigger.ExitActions> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="SelectionStates"> 
          <VisualState x:Name="Unselected" /> 
          <VisualState x:Name="Selected"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
               Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource ColorItemSelectedBackground}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="SelectedUnfocused"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
              Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" 
              Value="{StaticResource SelectedUnfocusedColor}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <ContentPresenter /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

です。 VisualSateGroupsMouseEnterMouseOverの両方で使用しようとしました。 MouseEnter何もしなかったので、MouseOverは元の状態に戻りませんでした。 この例は私が達成したいことを最もよく反映しています。

WPFは私には新しいものではありませんが、依存オブジェクトは非常に混乱しています。特に、プロパティの操作やアニメートに利用できる複数のアプローチがあります。 ドロップボックスを開くとNullReferenceExceptionがあります。それは私には明らかです。ストーリーボードにリンクされた依存オブジェクトは存在しませんが、このアプローチでは、Styleトリガー内にTargetNameプロパティを設定することはできません。

これにはどのようなアプローチが適していますか? VisualSateを「ネイティブ」な方法で使用している場合は、これをオーバートリガーにすることをお勧めします。

UPDATE

これは動作しますが、それは、トリガを使用しています。私はちょうど学習目的のためにVisualStateGroupsを使用してソリューションを好むだろう。

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsHighlighted" Value="true"> 
         <Trigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:0.01" 
                Storyboard.TargetName="Border" 
                Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                To="#FFA7ACD4" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.EnterActions> 

         <Trigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:0.6" 
                Storyboard.TargetName="Border" 
                Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                To="White" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </Trigger.ExitActions> 
        </Trigger> 
       </ControlTemplate.Triggers> 
       <Border x:Name="Border" 
         Padding="2" 
         SnapsToDevicePixels="true" 
         Background="White"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="SelectionStates"> 
          <VisualState x:Name="Unselected" /> 
          <VisualState x:Name="Selected"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
               Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{DynamicResource ColorItemSelectedBackground}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="SelectedUnfocused"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
              Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" 
              Value="{StaticResource SelectedUnfocusedColor}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <ContentPresenter /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

答えて

1

これを試してみてください:サイドノートとして

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 
       <Border x:Name="Border" 
            Padding="2" 
            SnapsToDevicePixels="true" 
            Background="White"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="Common"> 
          <VisualState x:Name="Normal"> 
           <Storyboard> 
            <ColorAnimation 
                 Storyboard.TargetName="Border" 
                 Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                 To="White" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:1" 
                 Storyboard.TargetName="Border" 
                 Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                 To="#FFA7ACD4" /> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="SelectionStates"> 
          <VisualState x:Name="Unselected" /> 
          <VisualState x:Name="Selected"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
                        Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="Red" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="SelectedUnfocused"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
                        Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="Green" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <ContentPresenter /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

>' Normal'は 'SelectionStates'>' Selected'でストーリーボードを上書きします。選択した項目のビジュアルヒントは、マウスが離れると再適用されません。何か案は? – DerpyNerd

+0

選択状態を共通グループに移動します。 – mm8

+0

私はあなたの努力に感謝します。しかし、私は理解していない。それが必要な場合、 'SelectionStates'グループはなぜ存在しますか? – DerpyNerd

0

をMM8の答えに。選択した項目を強調表示し、マウスポインタの下にある項目を強調表示する唯一の方法です。

VisualStateManagerは、Normal状態で上書きされるため、Selected状態に戻ることはできないようです。

そのため、私はVisualStateManagerを削除して、マルチトリガーアプローチにしました。素晴らしい作品が、これの唯一の問題はCommon` `でそのストーリーボードである

<Color x:Key="ItemBackground">White</Color> 
<Color x:Key="ItemSelectedBackground">#FFC5CBF9</Color> 
<Color x:Key="ItemMouseOverBackground">#FFA7ACD4</Color> 

<Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBoxItem}"> 

       <ControlTemplate.Triggers> 
        <!-- Trigger for hightlighting items on MouseOver --> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsHighlighted" Value="true" /> 
          <Condition Property="IsSelected" Value="false" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:0.01" 
                Storyboard.TargetName="Border" 
                Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                To="{StaticResource ItemMouseOverBackground}" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.EnterActions> 

         <MultiTrigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:0.2" 
                Storyboard.TargetName="Border" 
                Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                To="{StaticResource ItemBackground}" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.ExitActions> 
        </MultiTrigger> 
        <!-- Trigger for hightlighting selected items on MouseOver --> 
        <MultiTrigger> 
         <MultiTrigger.Conditions> 
          <Condition Property="IsHighlighted" Value="true" /> 
          <Condition Property="IsSelected" Value="true" /> 
         </MultiTrigger.Conditions> 
         <MultiTrigger.EnterActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:0.01" 
                Storyboard.TargetName="Border" 
                Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                To="{StaticResource ItemMouseOverBackground}" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.EnterActions> 

         <MultiTrigger.ExitActions> 
          <BeginStoryboard> 
           <Storyboard> 
            <ColorAnimation Duration="0:0:0.2" 
                Storyboard.TargetName="Border" 
                Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" 
                To="{StaticResource ItemSelectedBackground}" /> 
           </Storyboard> 
          </BeginStoryboard> 
         </MultiTrigger.ExitActions> 
        </MultiTrigger> 
       </ControlTemplate.Triggers> 

       <Border 
        x:Name="Border" 
        Padding="2" 
        SnapsToDevicePixels="true" 
        Background="White"> 
        <!--<VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames 
             Storyboard.TargetName="Border" 
             Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{StaticResource ItemBackground}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames 
             Storyboard.TargetName="Border" 
             Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{StaticResource ItemMouseOverBackground}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="SelectionStates"> 
          <VisualState x:Name="Unselected" /> 
          <VisualState x:Name="Selected"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames 
             Storyboard.TargetName="Border" 
             Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" Value="{StaticResource ItemSelectedBackground}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="SelectedUnfocused"> 
           <Storyboard> 
            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" 
              Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)"> 
             <EasingColorKeyFrame KeyTime="0" 
              Value="{StaticResource SelectedUnfocusedColor}" /> 
            </ColorAnimationUsingKeyFrames> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups>--> 
        <ContentPresenter /> 
       </Border> 

      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>