在我們的程序中,有時我們需要當綁定到UI界面上的屬性值發生變化從而引起數據更新的時候能夠加載一些動畫,從而使數據更新的效果更佳絢麗,在我們的程序中盡量將動畫作為一種資源放在xaml中,而不是在后台中通過寫代碼的這種方式來加載動畫,在我們的這篇博客中我們盡量使用簡潔的語言來闡述這一方法。
1 首先來看一下寫到資源中的Storyboard
<Storyboard x:Key="FadeIn">
<DoubleAnimation Storyboard.TargetName="translateTransform" Storyboard.TargetProperty="X" From="-516" To="0">
<DoubleAnimation.EasingFunction>
<CircleEase EasingMode="EaseIn"></CircleEase>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<DoubleAnimation Storyboard.TargetName="translateTransform" Storyboard.TargetProperty="Y" From="100" To="0">
<DoubleAnimation.EasingFunction>
<CircleEase EasingMode="EaseIn"></CircleEase>
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
</Storyboard>
這里面的translateTransform是為Canvas所定義的一個RenderTansform。
<Canvas Grid.Row="2" x:Name="NoticeTextBlock">
<Canvas.RenderTransform>
<TranslateTransform x:Name="translateTransform" X="0"></TranslateTransform>
</Canvas.RenderTransform>
<TextBlock Text="{Binding Path=CurrentBindingObject.Notice,Mode=TwoWay}" TextWrapping="Wrap"></TextBlock>
</Canvas>
2 第二步就是如何在綁定到前台的數據更新時加載動畫效果。首先貼出代碼,然后再做進一步的分析。
public partial class DisplayLayer : UserControl
{
public DisplayLayer()
{
InitializeComponent();
Loaded+=new RoutedEventHandler(DisplayLayer_Loaded);
}
private void DisplayLayer_Loaded(object sender, RoutedEventArgs e)
{
DisplayViewModels current = this.DataContext as DisplayViewModels;
if (current != null)
{
current.CurrentBindingObject.PropertyChanged+=Current_PropertyChanged;
}
}
private void Current_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "Notice")
{
Dispatcher.Invoke(new Action(() =>
{
(TryFindResource("FadeIn") as Storyboard).Begin();
}));
}
}
}
3 這里在當前用戶控件加載完成后,找到綁定到前台的DataContext對象(這里是current.CurrentBindingObject)然后利用PropertyChanged事件來寫該事件,首先我們來看一下PropertyChangedEventArgs這個類。
// 摘要:
// 為 System.ComponentModel.INotifyPropertyChanged.PropertyChanged 事件提供數據。
public class PropertyChangedEventArgs : EventArgs
{
// 摘要:
// 初始化 System.ComponentModel.PropertyChangedEventArgs 類的新實例。
//
// 參數:
// propertyName:
// 已更改的屬性的名稱。
public PropertyChangedEventArgs(string propertyName);
// 摘要:
// 獲取已更改的屬性名稱。
//
// 返回結果:
// 已更改的屬性的名稱。
public virtual string PropertyName { get; }
}
這里面定義了當前類的構造函數,和獲取已更改的屬性的名稱。在我們的程序中通過e.PropertyName能夠獲取當前屬性的變化對象,這里我們找到Notice綁定的對象,然后通過(TryFindResource("FadeIn") as Storyboard).Begin();來動態加載動畫,這種方式在WPF中應該是一種比較合理的加載動畫的方式,另外還有一個需要注意的地方是必須是在整個窗體加載完成(Loaded加載時)才能夠獲取到當前綁定的DataContext否則獲取的值為null。
