网格背景图像不透明度动画

时间:2012-04-27 17:44:09

标签: wpf animation

使用wpf创建一个简单的jquery-nivo-like slider,并希望在幻灯片之间添加动画,以淡化背景,更改背景图像,最后淡化回新的背景图像。我试图做以下事情....我没有错误,背景改变,但也没有任何动画......我做错了什么?

public void SetSlider(MyItem item)
    {
        //Fade out
        DoubleAnimation fadeOutAnimation = new DoubleAnimation(0, TimeSpan.FromSeconds(3));
        fadeOutAnimation.AutoReverse = false;
        grdContent.Background.BeginAnimation(Brush.OpacityProperty, fadeOutAnimation);

        //set background
        ImageBrush bgBrush = new ImageBrush();
        bgBrush.ImageSource = new BitmapImage(new Uri(item.ImageFile.SavedDirectoryAndFile, UriKind.Absolute));
        grdContent.Background = bgBrush;

        //Set title
        txtTitle.Text = item.Title;

        //set Summary
        txtSummary.Text = item.Summary;

        //Fade back in
        DoubleAnimation fadeInAnimation = new DoubleAnimation(1, TimeSpan.FromSeconds(3));
        fadeInAnimation.AutoReverse = false;
        grdContent.Background.BeginAnimation(Brush.OpacityProperty, fadeInAnimation);        
} 

2 个答案:

答案 0 :(得分:2)

想出来......我不得不将动画应用到在背景属性中设置的画笔...而不是背景属性本身,我不得不做一些时间更改。这是我的最终解决方案:

public void SetSlider(MyItem item)
    {
        //Create the fade out animation. 
        DoubleAnimation fadeOutAnimation = new DoubleAnimation(0, TimeSpan.FromMilliseconds(500));
        fadeOutAnimation.AutoReverse = false;

        //wait until the first animation is complete before changing the background, or else it will appear to just "fadeIn" with now fadeout.
        fadeOutAnimation.Completed += delegate(object sender, EventArgs e)
        {
            //once the fadeout is complete set the new back ground and fade back in. 
            //Create a new background brush. 
            ImageBrush bgBrush = new ImageBrush();
            bgBrush.ImageSource = new BitmapImage(new Uri(item.ImageFile.SavedDirectoryAndFile, UriKind.Absolute));
            bgBrush.Opacity = 0;

            //Set the grid background to the new brush. 
            grdContent.Background = bgBrush; 

            //Set the brush...(not the background property) with the animation. 
            DoubleAnimation fadeInAnimation = new DoubleAnimation(1, TimeSpan.FromMilliseconds(500));
            fadeInAnimation.AutoReverse = false;
            bgBrush.BeginAnimation(Brush.OpacityProperty, fadeInAnimation);
        };

        //Fade out..before changing the background. 
        var currentBackground = grdContent.Background;
        currentBackground.BeginAnimation(Brush.OpacityProperty, fadeOutAnimation);

        //Set title
        txtTitle.Text = item.Title;

        //set Summary
        txtSummary.Text = item.Summary;
    }

答案 1 :(得分:1)

更简单的方法是使用Transitional's他们有一个图像动画示例项目。

参考文献:

xmlns:trans="clr-namespace:Transitionals;assembly=Transitionals"
xmlns:transc="clr-namespace:Transitionals.Controls;assembly=Transitionals"
xmlns:transt="clr-namespace:Transitionals.Transitions;assembly=Transitionals"
xmlns:refl="clr-namespace:System.Reflection;assembly=mscorlib"


 <transc:TransitionElement x:Name="TransitionBox" Grid.Row="1" Content="{Binding 
             CurrentImage}">
   <transc:TransitionElement.Transition>
      <transt:TranslateTransition StartPoint="1,0" EndPoint="0,0"  
                Duration="0:0:0.6"/>
        </transc:TransitionElement.Transition>
    </transc:TransitionElement>

或使用SlideShow Control,如果它是自动转换。

 <transc:Slideshow.TransitionSelector>
                <trans:RandomTransitionSelector>
                    <trans:RandomTransitionSelector.TransitionAssemblies>
                        <refl:AssemblyName Name="Transitionals" />
                    </trans:RandomTransitionSelector.TransitionAssemblies>
                </trans:RandomTransitionSelector>
 </transc:Slideshow.TransitionSelector>