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 に答える