2016-06-22 2 views
1

내 채팅 응용 프로그램에서는 메시지를 보내는 사람이 누구인지 그리고 자신의 채팅 창이 사용자 측에서 열려 있지 않은 경우 목록 상자에서 그의 이름이 깜박이면서 수신 메시지를 사용자에게 알리는 사용자 목록이 있습니다. 사용자가 보낸 사람을 선택하면 애니메이션이 제거됩니다.하지만 마지막으로 애니메이션이 적용된 요소에 대해서만 애니메이션이 중지됩니다.스토리 보드 애니메이션을 ListBoxItem에 적용하는 것을 멈추는 방법?

private void OnlineUserListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
    ListBoxItem listBoxItem = OnlineUserList.ItemContainerGenerator.ContainerFromItem(OnlineUserList.SelectedItem) as ListBoxItem; 
       if (listBoxItem != null && listBoxItem.HasAnimatedProperties) 
       { 
        blinkStoryboard.Stop(listBoxItem); 
       } 

}

: 아래

private void BlinkSenderUsername(int index, string userRole) 
    { 
     blinkAnimation = new DoubleAnimationUsingKeyFrames(); 
     blinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)))); 
     blinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(250)))); 
     ListBoxItem target = new ListBoxItem(); 

    target = OnlineUserList.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem; 
     OnlineUserList.ScrollIntoView(target); 

     blinkStoryboard = new Storyboard 
     { 
      Duration = TimeSpan.FromMilliseconds(900), 
      RepeatBehavior = RepeatBehavior.Forever, 
     }; 

     Storyboard.SetTarget(blinkAnimation, target); 
     Storyboard.SetTargetProperty(blinkAnimation, new PropertyPath(OpacityProperty)); 

     blinkStoryboard.Children.Add(blinkAnimation); 
     blinkStoryboard.Begin(target, true); 
    } 

및 선택에

는 (선택에 애니메이션을 중지) 목록 상자의 변경 이벤트를 내가 ListBoxItem의에 애니메이션을 적용하기 위해 사용하고있는 코드입니다

누구나 제안 할 수 있습니까, 내가 뭘 잘못하고 있니? (재이의 대답에 따라) 편집

: -

static void MyClassStaticConstructor() 
    { 
     BlinkAnimation = new DoubleAnimationUsingKeyFrames(); 
     BlinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)))); 
     BlinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(250)))); 

     BlinkStoryboard = new Storyboard 
     { 
      Duration = TimeSpan.FromMilliseconds(900), 
      RepeatBehavior = RepeatBehavior.Forever, 
     }; 

     BlinkStoryboard.Children.Add(BlinkAnimation); 
    } 

    private void BlinkSenderUsername(int index, string userRole) 
    { 
     // There is no need to instantiate a ListBoxItem 
     //ListBoxItem target = new ListBoxItem(); 
      ListBoxItem target = OnlineUserList.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem; 

     if (target == null) return; 
     MyClassStaticConstructor(); 
     Storyboard.SetTarget(BlinkAnimation, target); 
     Storyboard.SetTargetProperty(BlinkAnimation, new PropertyPath(OpacityProperty)); 

     BlinkStoryboard.Begin(target, true); 
    } 

및 목록 상자에서 selectionChanged 이벤트 :

private void OnlineUserListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
ListBoxItem listBoxItem = OnlineUserList.ItemContainerGenerator.ContainerFromItem(OnlineUserList.SelectedItem) as ListBoxItem; 
      if (listBoxItem != null && listBoxItem.HasAnimatedProperties) 
      { 
       BlinkStoryboard.Stop(listBoxItem); 
      }} 
+0

"애니메이션이 먼저 적용된 요소를 제외한 다른 모든 목록 상자 항목에 대해 애니메이션이 중지됩니다." 방법? – Jai

+0

애니메이션이 처음 적용된 SenderName을 제외하고는 다른 모든 Senders에 대한 애니메이션을 중지 할 수 있습니다. 즉 사용자가 UserA에서 메시지를 받으면 그의 이름이 깜박이기 시작하고 Againg 사용자가 UserB로부터 메시지를받습니다. 깜박임 시작), UserB를 클릭하면 애니메이션이 중지되지만 UserA를 클릭하면 깜박입니다.). 지금은 분명합니까? – NewbieCoder

+0

코드를 다시 디버그하고 마지막으로 적용된 요소에 대해서만 애니메이션이 중지된다는 것을 알아야합니다. – NewbieCoder

답변

1

문제는 각 ListBoxItem를 들어, 하나의 Storyboard와 있음을 작성한다 하나의 Animation 개체. 스토리 보드 및 애니메이션 객체는 모두 하나의 전역 필드에 저장됩니다. 이러한 애니메이션을 여러 개 설정하면 전역 입력란에 라는 참조가 마지막으로 추가 된 애니메이션/스토리 보드의 참조를 갖게됩니다.

변경이의 구현 :

private static readonly DoubleAnimationUsingKeyFrames BlinkAnimation; 
private static readonly Storyboard BlinkStoryboard; 

static MyClassStaticConstructor() 
{ 
    BlinkAnimation = new DoubleAnimationUsingKeyFrames(); 
    BlinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(1, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(0)))); 
    BlinkAnimation.KeyFrames.Add(new DiscreteDoubleKeyFrame(0, KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(250)))); 

    BlinkStoryboard = new Storyboard 
    { 
     Duration = TimeSpan.FromMilliseconds(900), 
     RepeatBehavior = RepeatBehavior.Forever, 
    }; 

    BlinkStoryboard.Children.Add(blinkAnimation); 
} 

private void BlinkSenderUsername(int index, string userRole) 
{ 
    // There is no need to instantiate a ListBoxItem 
    //ListBoxItem target = new ListBoxItem(); 
    ListBoxItem target = OnlineUserList.ItemContainerGenerator.ContainerFromIndex(index) as ListBoxItem; 

    if (target == null) return; // Just make sure we managed to get a ListBoxItem instance 
    OnlineUserList.ScrollIntoView(target); 

    Storyboard.SetTarget(BlinkAnimation, target); 
    Storyboard.SetTargetProperty(BlinkAnimation, new PropertyPath(OpacityProperty)); 

    BlinkStoryboard.Begin(target, true); 
} 

애니메이션과 스토리 보드 객체 재사용 - 그래서 여러 컨트롤이 같은 애니메이션을 필요로하는 경우, 그들은 같은 애니메이션/스토리 보드 인스턴스를 사용할 수 있습니다. 한 번만 인스턴스화하면됩니다. 제 답변에서 저는 그것들을 정적으로 만들었지 만, 당신은 그것들을 고정시키지 않는 선택을했습니다.

+0

Storyboard.SetTarget (BlinkAnimation, target) 바로 위의 MyClassStaticConstructor()라는 Null 참조 예외가 발생했습니다. 그러나 문제는 여전히 동일합니다. 마지막 항목에 대해서만 애니메이션이 중지됩니다. – NewbieCoder

+0

솔루션 Jai에 너무 감사드립니다. 나는 마침내 내가 원하는 방식으로 일하고있다. 너는 내 하루를 구했다. 고마워, 친구. :) – NewbieCoder

관련 문제