2010-03-03 2 views
5
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="grid"> 
      <Grid.Background> 
       <SolidColorBrush x:Name="backgroundBrush" Color="Transparent" Opacity="0.1"/> 
      </Grid.Background> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsExpanded}" Value="True"> 
       <Setter TargetName="backgroundBrush" Property="Color" Value="Green" /> 
      </DataTrigger> 
      <Trigger SourceName="grid" Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="backgroundBrush" 
           Storyboard.TargetProperty="Color" 
           To="White" Duration="0:0:1.5"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="backgroundBrush" 
           Storyboard.TargetProperty="Color" 
           AccelerationRatio="1" Duration="0:0:1.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

'트리거 대상을 찾을 수 없습니다. backgroundBrush'. 'WPF DataTrigger가 트리거 대상을 찾을 수 없습니다.

DataTrigger를 제거하면 컴파일되고 작동합니다. TargetName="grid" Property="Background"을 사용하도록 DataTrigger를 변경하면 컴파일되고 작동합니다 (그러나 원하는 불투명도는 제외).

어디로 잘못 가고 있습니까?

+0

+1, 좋은 질문입니다. WPF를 이해할 수 있다고 생각했지만 실제로 작동하지 않는 이유는 없습니다. – Heinzi

+0

(최근 댓글이지만 아직 ...) 실제로 두 가지 색상이 있어야 할 때 색상 값을 변경하고 있습니다 (정의 됨 로컬 리소스로 사용) 트리거끼리 교환하십시오. 나는 이것이 문제의 원인이라고 생각할 것이다. – heltonbiker

답변

4

브러시가 네임 스코프에없는 이유를 모르겠지만 브러시를 스왑 아웃하고 애니메이션에서 배경 브러시의 Color 속성에 "점으로 찍어서 내려"다음과 같이 할 수 있습니다.

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid x:Name="grid"> 
      <Grid.Background> 
       <SolidColorBrush Color="Transparent" Opacity="0.1"/> 
      </Grid.Background> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding IsExpanded}" Value="True"> 
       <Setter TargetName="grid" Property="Background"> 
        <Setter.Value> 
         <SolidColorBrush Color="Green" Opacity="0.1"/> 
        </Setter.Value> 
       </Setter> 
      </DataTrigger> 
      <Trigger SourceName="grid" Property="IsMouseOver" Value="True"> 
       <Trigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="grid" 
          Storyboard.TargetProperty="Background.Color" 
          To="White" Duration="0:0:1.5"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.EnterActions> 
       <Trigger.ExitActions> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetName="grid" 
          Storyboard.TargetProperty="Background.Color" 
          AccelerationRatio="1" Duration="0:0:1.5" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </Trigger.ExitActions> 
      </Trigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

그게 효과가있어 - 고마워. backgroundBrush는 실제로 StoryBoard 트리거의 범위에 있으며 수정하지 않고 작동합니다. DataTrigger의 범위를 벗어나는 이유를 이해할 수 없습니다. – djskinner

+0

그래, 나도 그걸 알아낼 수 없었다. Storyboard의 TargetName이 런타임에 해석되는 반면 Setter의 TargetName은 XAML 구문 분석 시간에 해석되는 것 같습니다. –

+0

OP 코드가 명명 된 브러시의 색상 속성을 변경하고있었습니다. 이 코드는 명명 된 요소의 속성 브러시를 변경합니다. 이것이이 코드가 작동하는 이유입니다. OP는 그렇지 않습니다. 더 나은 방법은 두 브러시를 데이터 템플릿의 (다른) 리소스로 선언하고 세터에서 참조하는 것입니다. – heltonbiker

관련 문제