2017-12-02 6 views
0

내 WPF 응용 프로그램에서 ComboBox에 대한 사용자 지정 템플릿을 작성하고 있습니다. 이름 ShadowEffect하지 않는 것을 인용,트리거를 사용하여 효과를 어떻게 대상으로합니까?

<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을 참조 할 수 있습니까?

나는 테두리의 전체 Effect 속성을 설정할 수 있다는 것을 알았지 만, 애니메이션을 추가하려고하면이 접근법이 떨어져 버립니다.

답변

0

사실 짜증이납니다. Setter 경로를 지정할 수 없습니다. 아무거나가 DropShadowEffect이라고 지명 된 재산이더라도, 당신은 그것에 얻을 수 없었다. 애니메이션을 사용할 수는 있지만 훨씬 더 장황하고 밤새도록 할 필요가 없습니다.

대신 할 수있는 것은 이전 Tag 해킹입니다. Tag은 잡아 먹을 때까지 작동하며, 종속성 속성이므로 값이 변경되면 바인딩을 업데이트합니다. Border.Tag은 0으로 초기화되고 setter는 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를 설정해야합니다. 그것이 제가 선호했을만한 해결책 이었지만 찾아 볼 시간이 없었습니다. 이제 나는 술집에서 나가고있다. –