The problem is that after your animation completes your control still has Visibility=Visible, so it cannot be entered again. You need set AutoReverse="True" for your FadeIn and FadeOut Storyboard.
<Storyboard x:Key = "FadeIn">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty = "(UIElement.Opacity)"
Storyboard.TargetName = "{x:Null}"
BeginTime = "0:0:0" AutoReverse="True">
<EasingDoubleKeyFrame KeyTime = "0:0:0"
Value = "0"/>
<EasingDoubleKeyFrame KeyTime = "0:0:0.5"
Value = "0"/>
<EasingDoubleKeyFrame KeyTime = "0:0:1"
Value = "1"/>
</DoubleAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty = "(UIElement.Visibility)"
Storyboard.TargetName = "{x:Null}"
BeginTime = "0:0:0" AutoReverse="True" >
<DiscreteObjectKeyFrame KeyTime = "0:0:0.0"
Value = "{x:Static Visibility.Visible}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key = "FadeOut">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty = "(UIElement.Opacity)"
Storyboard.TargetName = "{x:Null}"
BeginTime = "0:0:0" AutoReverse="True">
<EasingDoubleKeyFrame KeyTime = "0:0:0"
Value = "1"/>
<EasingDoubleKeyFrame KeyTime = "0:0:0.5"
Value = "1"/>
<EasingDoubleKeyFrame KeyTime = "0:0:3"
Value = "0"/>
</DoubleAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty = "(UIElement.Visibility)"
Storyboard.TargetName = "{x:Null}"
BeginTime = "0:0:0" AutoReverse="True" >
<DiscreteObjectKeyFrame KeyTime = "0:0:3"
Value = "{x:Static Visibility.Collapsed}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>