1

使用 wpf 创建了一个类似 jquery-nivo的简单滑块,并希望在幻灯片之间添加一个动画,该动画淡化背景,更改背景图像,最后淡出新的背景图像。我正在尝试执行以下操作....我没有收到错误,背景更改,但也没有任何动画...我做错了什么?

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);        
} 
4

2 回答 2

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;
    }
于 2012-04-27T20:23:46.797 回答
1

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

参考:

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>

或者如果它是自动转换,则使用它具有的幻灯片控件。

 <transc:Slideshow.TransitionSelector>
                <trans:RandomTransitionSelector>
                    <trans:RandomTransitionSelector.TransitionAssemblies>
                        <refl:AssemblyName Name="Transitionals" />
                    </trans:RandomTransitionSelector.TransitionAssemblies>
                </trans:RandomTransitionSelector>
 </transc:Slideshow.TransitionSelector>
于 2012-04-27T18:10:29.303 回答