动画和路由事件处理程序

时间:2014-02-19 23:50:48

标签: c# wpf animation

所以我试图创建一个闹钟响起时触发的基本动画。动画将是一个不透明度动画,可将整个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 = "";
        }
    }

那么我该如何添加呢?我也提供了有用的资源,可以帮我完成这项任务吗?

2 个答案:

答案 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. DataTriggers允许您从代码
  2. 启动动画
  3. 您的DataTrigger应绑定到DataContext中的属性,在本例中为ViewModel
  4. 如果您以前没有使用ViewModels,可以绑定其公共属性,如果您实现INotifyPropertyChanged或创建属性为DependencyProperties

答案 1 :(得分:0)

基本上我发现了一种在C#编码本身中制作动画的方法,没有事件触发器或XAML或故事板。 要重新创建所需内容,只需MSDN Animation Without Storyboard