Я создаю пользовательский элемент управления под названием ImageFader. Шаблон стиля выглядит так:
<ControlTemplate TargetType="{x:Type controls:ImageFader}">
<Grid>
<Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Stretch="{TemplateBinding Stretch}"
x:Name="PART_SourceImage" Opacity="1" />
<Image HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Stretch="{TemplateBinding Stretch}"
x:Name="PART_TargetImage" Opacity="0" />
</Grid>
<ControlTemplate.Resources>
<Storyboard x:Key="FadeImageStoryboard">
<!-- fade in the new image -->
<DoubleAnimation From="0" To="1"
Duration="{TemplateBinding FadeTime}"
Storyboard.TargetName="PART_TargetImage"
Storyboard.TargetProperty="Opacity" />
<!-- fade out the previous image -->
<DoubleAnimation From="1" To="0"
Duration="{TemplateBinding FadeTime}"
Storyboard.TargetName="PART_SourceImage"
Storyboard.TargetProperty="Opacity" />
</Storyboard>
</ControlTemplate.Resources>
</ControlTemplate>
В коде у меня есть это:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
SourceImage = Template.FindName("PART_SourceImage", this) as Image;
TargetImage = Template.FindName("PART_TargetImage", this) as Image;
FadeImageStoryboard = Template.Resources["FadeImageStoryboard"] as Storyboard;
FadeImageStoryboard.Completed += new EventHandler(FadeImageStoryboard_Completed);
}
В готовом обработчике я пытаюсь поменять изображения и сбросить их непрозрачность:
private void FadeImageStoryboard_Completed(object sender, EventArgs e)
{
SourceImage.Source = TargetImage.Source;
SourceImage.Opacity = 1;
TargetImage.Opacity = 0;
}
Я запускаю анимацию внутри DispatchTimer, используя это:
FadeImageStoryboard.Begin(this, this.Template, true);
Все работает хорошо, пока я не поместил два или более элемента управления ImageFader в одно и то же окно. Когда я это делаю (с DispatchTimer, запускающим анимацию через разные промежутки времени) событие завершения раскадровки запускается для обоих ImageFaders.
Я считаю, что мой элемент управления получает раскадровку из ресурсов шаблона в качестве статической ссылки.
Как мне избежать этого?