2017-12-02 16 views
0

私のWPFアプリケーションでは、ComboBox用のカスタムテンプレートを作成しています。私は、ときに、ユーザーがマウスを置いたそれ以上のコンボボックスが上昇し、影の効果を達成したいので、私はこのコードを書いてみました:トリガーでエフェクトをターゲットに設定するにはどうすればよいですか?

<ControlTemplate TargetType="{x:Type ComboBox}"> 
    <Border x:Name="templateRoot" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      CornerRadius="4" SnapsToDevicePixels="True"> 
     <Grid SnapsToDevicePixels="True"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="0" MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" /> 
      </Grid.ColumnDefinitions> 
      <Border x:Name="Shadow" 
        Grid.Column="0" Grid.ColumnSpan="2" 
        Margin="-3" 
        Background="{DynamicResource L1Brush}"> 
       <Border.Effect> 
        <DropShadowEffect x:Name="ShadowEffect" 
             BlurRadius="0" ShadowDepth="0" /> 
       </Border.Effect> 
      </Border> 
      <!-- rest of the template --> 
     </Grid> 
    </Border> 
    <ControlTemplate.Triggers> 
     <!-- other triggers --> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="ShadowEffect" Property="DropShadowEffect.BlurRadius" Value="5" /> 
     </Trigger> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter TargetName="ShadowEffect" Property="DropShadowEffect.BlurRadius" Value="5" /> 
     </Trigger> 
     <!-- other triggers --> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

をただし、実行時に、それはエラーをスローし、名前ShadowEffectがないことを理由に存在する。この仕事をするにはどうすればいいですか?そして私がこれをアニメートしたい場合、ストーリーボードからShadowEffectをどのように参照するのですか?

私はちょうどボーダーのプロパティ全体を設定することができますが、私はアニメーションを追加しようとすると、このアプローチは分かりません。

答えて

0

実際には迷惑です。 Setterにパスを与えることはできません。ここに何かがDropShadowEffectという財産を持っていても、あなたはそれに行くことができませんでした。あなたはアニメーションを使うことができますが、それははるかに冗長であり、私は一晩中持っていません。

代わりにできるのは古いTagハックです。 Tagはグラブのために稼働しており、それは依存性プロパティーなので、値が変更されたときにバインドを更新します。 Border.Tagは0に初期化され、セッターは5に設定され、DropShadowEffectBlurRadiusにバインドされます。

<ControlTemplate TargetType="{x:Type ComboBox}" x:Key="ComboTemplate"> 
    <Border x:Name="templateRoot" 
     Background="{TemplateBinding Background}" 
     BorderBrush="{TemplateBinding BorderBrush}" 
     BorderThickness="{TemplateBinding BorderThickness}" 
     CornerRadius="4" SnapsToDevicePixels="True"> 
     <Grid SnapsToDevicePixels="True"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
       <ColumnDefinition Width="0" MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" /> 
      </Grid.ColumnDefinitions> 
      <Border 
       x:Name="Shadow" 
       Grid.Column="0" 
       Grid.ColumnSpan="2" 
       Margin="-3" 
       Background="{DynamicResource L1Brush}" 
       Tag="0" 
       > 
       <Border.Effect> 
        <DropShadowEffect 
         BlurRadius="{Binding Tag, RelativeSource={RelativeSource AncestorType=Border}}" 
         ShadowDepth="0" 
         /> 
       </Border.Effect> 
      </Border> 
      <!-- rest of the template --> 
     </Grid> 
    </Border> 
    <ControlTemplate.Triggers> 
     <!-- other triggers --> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter TargetName="Shadow" Property="Tag" Value="5" /> 
     </Trigger> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter TargetName="Shadow" Property="Tag" Value="5" /> 
     </Trigger> 
     <!-- other triggers --> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
+0

これは賢い解決策です。ありがとうございます!しかし、もう一つ - ' <ストーリーボードStoryboard.TargetName = "ShadowEffect"> はトリックを行うようですが、アニメーションは非常に不安定です。どうして? – 333

+0

@ 333 DoubleAnimation IIRCのFromとToを設定する必要があります。それは私が好むだろうが見上げる時間がなかった解決策です。今私は出かけていたバーにいます。 –

関連する問題