바운드 값이 변경 될 때 애니메이션을 시작하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1122177

문제

이것은 자주 발생하는 상황입니다.

보기에는 뷰 모델 속성 (inotifyPropertyChanged에 의해 뒷받침)에 제어가 있습니다. 예를 들어:

<TextBlock Text="{Binding Path=Subtotal}"/>

속성이 변경되면 창의적인 애니메이션을 사용하여 사용자를 사실에 주목해야합니다. 보기가 이미 알림에 연결되어 있다는 사실을 활용하고 추가 코드의 많은 부분을 생성하지 않습니다 (또는 적어도 한 번은 생성하고 재사용). 데이터 트리거가 아마도 최선의 선택 일지 모르지만, 어떤 값 변경과 일부 특정 값에 비해 발사하는 방법을 모르겠습니다.

다음 옵션이 떠 오릅니다.

  • ViewModel에서 추가 이벤트를 제기하고 View Code-Behind에서 구독하십시오.
  • 값이 바뀌는 경우 TRUE를 반환하는 변환기를 사용하여 언급 된 속성에 바인딩 된 DatATRIGGER를 만듭니다.
  • 변경 사항을 "신호"하는 데 사용되는 ViewModel의 새로운 부울 속성에 묶인 Datatrigger를 만듭니다.
  • 컨트롤 의존성 속성 변경을 구독하고 애니메이션을 시작하는 컨트롤에 첨부 된 동작을 만듭니다.

어떤 것을 좋아하거나 사용합니까? 옵션이 놓쳤습니까?

추신 : 솔루션이 애니메이션을 먼저 시작하고 종료 될 때 가치 변경을 반영 할 수있는 가능성을 제공한다면 좋을 것입니다.

도움이 되었습니까?

해결책

좋아, 이것은 내가 실험 한 후에 내가 온 것입니다.

종속성 속성으로 표현식 블렌드 3 트리거를 만들었습니다 (IT 구독이라고 명명 됨). 구독을 내 텍스트 블록과 동일한 값으로 바인딩 하고이 트리거가 표현식 블렌드 3의 ControlStoryBoardAction에 첨부됩니다.

트리거는 다음과 같습니다.

public class DataTriggerPlus : TriggerBase<DependencyObject>
{
    public static readonly DependencyProperty SubscriptionProperty =
        DependencyProperty.Register("Subscription", 
            typeof(string),
            typeof(DataTriggerPlus),
            new FrameworkPropertyMetadata("",
              new PropertyChangedCallback(OnSubscriptionChanged)));

    public string Subscription
    {
        get { return (string)GetValue(SubscriptionProperty); }
        set { SetValue(SubscriptionProperty, value); }
    }

    private static void OnSubscriptionChanged(DependencyObject d,
      DependencyPropertyChangedEventArgs e)
    {
        ((DataTriggerPlus)d).InvokeActions(null);
    }
}

스토리 보드에 어떻게 첨부되는지는 다음과 같습니다.

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
    <i:Interaction.Triggers>
        <local:DataTriggerPlus Subscription="{Binding TestProp}">
            <im:ControlStoryboardAction 
                Storyboard="{StaticResource Storyboard1}"/>
        </local:DataTriggerPlus>
    </i:Interaction.Triggers>
</TextBlock>

나는이 접근법을 많이 좋아합니다. 훌륭한 직업 조합 3 디자이너!

편집 : Drew Comment에 응답 ...

예, 블렌드와 함께 배송됩니다. 프로젝트에 microsoft.expression.interactions.dll 및 system.windows.inceractivity를 포함시킬 수 있습니다.

그리고 네, 그것은 장점입니다 (누군가가 스타일을 통해 행동을 적용하는 좋은 방법을 알아 냈는지 물었습니다. 이 질문에서) - 그러나 유연성의 이점도 있습니다. 예를 들어 스토리 보드를 시작할뿐만 아니라 상태를 전환하거나 동일한 트리거에서 다른 작업을 수행 할 수 있습니다.

다른 팁

애니메이션을 시작하는 트리거를 만들 수 있습니다.

이 같은:

<Style>
    <Style.Triggers>
       <Trigger 
            Property="ViewModelProperty"
            Value="True">
            <Trigger.EnterActions>
                 <BeginStoryboard Storyboard="YourStoryBoard" />
            </Trigger.EnterActions>
       </Trigger>
    </Style.Triggers>
</Style>

애니메이션이 완료되면 가치를 설정하는 문제에 대한 문제는 약간의 고통입니다. 스토리 보드에서 완성 된 이벤트를 사용해야한다는 것을 알고있는 한, Code 뒤에는 MVVM을 피하고 싶은 코드가 필요합니다.

이벤트 트리거를 사용하여 완료된 이벤트에 바인딩하려고 시도했지만 몇 가지 합병증도 소개했습니다. 보다 여기 자세한 사항은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top