2017-12-02 57 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不存在。我如何完成這項工作?如果我想動畫的話,我會如何從Storyboard中引用ShadowEffect

我意識到我可以設置邊框的整個Effect屬性,但是如果我嘗試添加動畫,這種方法會分崩離析。

回答

0

這實際上是一種煩人的;你不能給Setter一個路徑。即使這裏有任何東西有一個名爲DropShadowEffect的屬性,你也無法得到它。你可以使用動畫,但這更加冗長,我沒有整夜。

你可以做的是舊的Tag黑客。 Tag適合抓取,並且它是一個依賴項屬性,所以它會在其值更改時更新綁定。 Border.Tag被初始化爲零,設置者將其設置爲5,並且DropShadowEffect將其BlurRadius綁定到它。

<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。這是我希望的解決方案,但沒有時間查找。現在我在我前往的酒吧。 –