我在 Silverlight 中有三个用户控件。
UCOutside 包含两个名为 UCInside1 和 UCInside2 的用户控件。
包含用户控件
<!-- UCOutside -->
<UserControl.Resources>
<Storyboard x:Name="OutsideBoard">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Projection).(PlaneProjection.RotationY)" Storyboard.TargetName="LayoutRoot">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="45"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Grid.Projection>
<PlaneProjection/>
</Grid.Projection>
<local:UCInside1 Margin="39,35,266,173"/>
<local:UCInside2 HorizontalAlignment="Right" Margin="0,234,26,30" />
</Grid>
内部的第一个 UserControl
<!-- UCInside1 -->
<UserControl.Resources>
<Storyboard x:Name="ImageFade">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="myImage">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
<EasingDoubleKeyFrame KeyTime="0:0:1.5" Value="0.2"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top">
<Image x:Name="myImage" Margin="0" Source="/OtherImage.png" Stretch="Fill" Width="312" Height="250" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>
里面的第二个用户控件
<!-- UCInside2 -->
<UserControl.Resources>
<Storyboard x:Name="ButtonFade">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="image1">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" HorizontalAlignment="Left" Height="195" VerticalAlignment="Top" Width="218">
<Button Content="Button" HorizontalAlignment="Right" Margin="0,0,25,51" VerticalAlignment="Bottom" Width="75" Click="ClickButton"/>
<Image x:Name="image1" HorizontalAlignment="Left" Margin="41,32,0,70" Source="/Whatever.png" Stretch="Fill" Width="47"/>
</Grid>
您会注意到 Button 上的 ClickButton 事件。您还会注意到所有用户控件中都指定了简单的 Storyboard。
问题是如何让所有三个动画都通过点击事件启动?可以通过 XAML 或使用 Blend 全部绑定(bind)吗?如果不是,它是如何在 C# 代码中完成的?
最佳答案
我想说解决此问题的一种非常简单有效的方法是使用 INotifyPropertyChanged 接口(interface)以使用观察者模式。
让触发初始事件的容器成为可观察部分,让其他两个容器观察它。因此,每当可观察容器做某事(例如触发点击事件)时,其他容器都会收到通知并做出相应 react 。
一旦您的 OutsideContainer 类是可观察的,请执行以下两个步骤:
在 OutsideButton 类中,在适当的地方触发 PropertyChanged 事件(例如,发生“ super ”点击的地方。
在 ImageFade 和 ButtonFace 类中讨论 PropertyChanged 事件并执行某些操作(例如,让它们触发自己的点击事件)。
尝试以下操作:
在代码隐藏文件 OutsideBoard.cs 中实现 INotifyPropertyChanged 接口(interface)以使其可观察:
class OutsideBoard : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private void FirePropertyChanged (string property) {
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
// the click- EventHandler of your UserControl
public event Click_EventHandler (object sender, RoutedEventArgs e) {
// your clicking code of your UserControl
FirePropertyChanged("SuperClick");
}
// rest of the code inhere ...
}
现在每个想要观察 OutsideBorder 类的类都必须在该类上实现一个 EventHandler:
在 ButtonFade 和 ImageFade 类中编写如下内容:
outsideBorder.PropertyChanged += PropertyEventChangeHandler(MyClickHandling);
public void MyClickHandling (object sender, PropertyChangeEventArgs e) {
// do something
}
因此,每当 OutsideBoard 类触发 PropertyChanged 事件时,所有观察者都将通过调用他们的 MyClickHandling - 方法得到通知。
希望对你有所帮助。
关于c# - Silverlight:来自一个用户控件的事件能否在不同的用户控件和/或包含控件上开始动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7842398/