所以我试图创建一个闹钟响起时触发的基本动画。动画将是一个不透明度动画,可将整个UI或其部分的不透明度降低到0或50(取决于部件)。
现在,在尝试了许多关于降低对象不透明度的教程之后,所有这些动画教程都会运行“Button.Click”或“Button.IsEnabled”事件。我需要使用任何类型的按钮或其他用户界面点击启动我的。
我确实发现了这一点,它显示了制作RoutedEvent MSDN Create Custom RoutedEvent
的能力我需要添加的代码如下:
private void timer_Tick(object sender, EventArgs e)
{
TimeTop.Content = DateTime.Now.ToString("h" + ":" + "mm" + " " + "tt");
}
private void dispatcherTimer1_Tick(object sender, EventArgs e)
{
label1.Content = DateTime.Now.ToString("hh") + ":" + DateTime.Now.ToString("mm") + " " + DateTime.Now.ToString("t"+2);
}
private void dispatcherTimer2_Tick(object sender, EventArgs e)
{
//Alarm settings
if (label1.Content.Equals(label2.Content))
{
//Actual Wake Up Call
//TOOK OUT WAKE UP CALL
TimeOfDayCB.Text = "";
HourAlarmCB.Text = "";
MinuteAlarmCB.Text = "";
label2.Content = "";
}
}
那么我该如何添加呢?我也提供了有用的资源,可以帮我完成这项任务吗?
答案 0 :(得分:1)
执行所需操作的最佳方法是使用绑定到代码中某些属性的DataTrigger。这种动画最容易通过代码启动。
这是一种在绑定属性更改时启动动画的样式:
<Style x:Key="timerTriggeredFlash" TargetType="Label">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Window},
Path=DataContext.StartFlashing}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity"
From="0" To="1" RepeatBehavior="3x" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
请注意,我的ViewModel有一个公共布尔属性StartFlashing
,当我将其设置为true时,任何使用该样式的标签都会将其Opacity动画打开和关闭三次。
要使用样式,请在声明标签时参考样式名称,如下所示:
<Label Grid.Row="1"
Background="Red"
Style="{StaticResource timerTriggeredFlash}"
Content="Flashing label" />
我的ViewModel如下所示:
public class MainWindowViewModel : INotifyPropertyChanged {
DispatcherTimer _Timer;
public event PropertyChangedEventHandler PropertyChanged;
public MainWindowViewModel() {
_Timer = new DispatcherTimer();
_Timer.Interval = TimeSpan.FromSeconds(1);
_Timer.Tick += new EventHandler(_Timer_Tick);
_SecondsLeft = 3;
_Timer.Start();
}
void _Timer_Tick(object sender, EventArgs e) {
SecondsLeft = SecondsLeft - 1;
if (_SecondsLeft <= 0) {
StartFlashing = true;
_Timer.Stop();
}
}
private int _SecondsLeft;
public int SecondsLeft {
get { return _SecondsLeft; }
set {
_SecondsLeft = value;
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs("SecondsLeft"));
}
}
}
private bool _StartFlashing;
public bool StartFlashing {
get { return _StartFlashing; }
set {
_StartFlashing = value;
if (PropertyChanged != null) {
PropertyChanged(this, new PropertyChangedEventArgs("StartFlashing"));
}
}
}
}
最后,我的主要表单的代码隐藏连接到我的ViewModel,如下所示:
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
}
这里的关键方面是
答案 1 :(得分:0)
基本上我发现了一种在C#编码本身中制作动画的方法,没有事件触发器或XAML或故事板。 要重新创建所需内容,只需MSDN Animation Without Storyboard