2013-04-29 2 views
0

큐를 기반으로 불투명도를 변경하는 애니메이션 컨트롤을 만들려고합니다.WPF 불투명도 애니메이션 컨트롤 설정 IsEnabled = false

애니메이션 자체가 올바르게 작동합니다. 키 누르기에 따라 불투명도가 움직이며 컨트롤이 표시됩니다. 애니메이션의 나머지 부분이 포함 된 그리드 컨트롤에 애니메이션을 넣었습니다.

문제는 다음과 같습니다. 애니메이션이 끝나면 수동으로 코드 숨김에서 true로 설정 한 후에도 격자의 IsEnabled 속성이 "false"로 유지됩니다. 이 명령은 예외를 발생시키지 않지만 속성을 실제로 변경하지는 않습니다.

그런 다음 동일한 애니메이션을 다시 실행하지만 그 반대이면이 값은 실제로 "참"이됩니다. 그러나 물론, 그 순간에 그것은 이미 사라져 가고 있습니다. 몇 가지 추가 디버깅을 통해

void Initialize() 
{ 
    // fade animation storyboard 
    FadeAnimation = new DoubleAnimation(0.0, 1.0, 
     new Duration(TimeSpan.FromSeconds(0.7))) 
    { FillBehavior = FillBehavior.HoldEnd }; 

    FadeStoryboard.Children.Add(FadeAnimation); 
    Storyboard.SetTargetName(FadeAnimation, grid.Name); 
    Storyboard.SetTargetProperty(FadeAnimation, 
    new PropertyPath(Grid.OpacityProperty)); 
} 


// flipping the animation around 
void InputManager_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.Space) 
    { 
     if (!ViewModel.IsActive) 
     { 
      FadeAnimation.From = grid.Opacity; 
      FadeAnimation.To = 1.0; 
      FadeStoryboard.Begin(this); 
      ViewModel.IsActive = true; 
     } 
     else if (ViewModel.IsActive) 
     { 
      FadeAnimation.From = grid.Opacity; 
      FadeAnimation.To = 0.0; 
      FadeStoryboard.Begin(this); 
      ViewModel.IsActive = false; 
     } 
    } 
} 

[편집] 나는 정반대 인, 적극적으로 페이드에 false로 활성화 세트 애니메이션, 그리고이 페이드 아웃 할 때 true로 설정하는 것으로 나타났습니다 내가하고 싶은 일.

[편집 2] 완전히 애니메이션을 도랑에 넣을 때 똑같은 문제가 발생하고 숨김 상태로 표시 여부가 변경됩니다. 그것은 내가 숨김으로 만들 때 가능하게하고 내가 보이게 만들면 사용할 수 없도록 만듭니다.

+0

실제 질문은 무엇입니까? – Terry

+0

"IsEnabled"는 사실이되기를 거부합니다. 애니메이션은 작동하지만 내 이벤트는 수행하지 않습니다. –

답변

0

에서 찾을 수 있습니다. 더 정확하게 말하자면, 더 높은 레벨의 뷰 모델은 더 높은 레벨의 컨트롤을 동시에 비활성화하고있었습니다. 이것이 저급 수준을 가능하게하는 것이 불가능한 이유입니다.

1

DependencyProperties는 애니메이션이 목록에서 상위에 위치하는 우선 순위가 있습니다. 홀드 동작과

  • 속성 시스템 강제
  • 액티브 애니메이션을 애니메이션.
  • 로컬 값
  • TemplatedParent 템플릿 속성
  • 암시 적 스타일
  • 스타일
  • 템플릿 트리거
  • 스타일 세터
  • 이 부모로부터 상속
  • 기본 (테마) 스타일
  • 기본 값을 트리거 종속성 속성 메타 데이터에서

기본적으로 애니메이션에는 HoldEnd의 FillBehavior가 있습니다. 즉, 애니메이션이 끝난 값으로 유지됩니다. 따라서 귀하의 경우 IsEnabled의 가치를 변경하려고 시도하고 있지만 우선 순위가 더 높습니다.

IsEnabled 트리거에 ExitAction을 추가하여 스토리 보드를 중단하고 애니메이션의 끝 부분에서 애니메이션이 계속해서 어설 션되지 않도록하여 로컬 값 스타일을 적용 할 수 있습니다 . 이 옵션은 (# 1에서와 같이) 스타일을 반복하지 않아도되고 (# 2 에서처럼) 애니메이션을 뒤집을 필요가 없다는 이점이 있습니다.

더 많은 정보와 백업 정보에 대한 링크가 그것은 viewmodels에 문제가 밝혀졌다 here

+0

답장을 보내 주셔서 감사합니다. 내 코드와 그 예제에는 약간의 차이점이 있습니다. 내 애니메이션은 실제로 IsEnabled 트리거에서 시작하지 않고 뷰 모델의 속성에서 시작합니다. 또한이 문제는 컨트롤을 자동으로 비활성화하는 0.0 불투명도에 대한 컨트롤을 시작한다는 사실 때문에 발생합니다. –

+0

그래서 제대로 이해하면 애니메이션이 코드에서 실행됩니다. 그렇다면 애니메이션에 코드에 트리거를 추가하여 해답에 설명 된 속성을 설정하여 IsEnabled를 코드로 설정할 수 있습니다. – Terry

+0

나는 이제 스토리 보드 애니메이션을 모두 제거했습니다. 가시성을 숨김으로, 뒤에서 전환했습니다. 스토리 보드 나 불투명도를 사용하지 않아도 블럭이 활성화됩니다. –