在WPF中如何为一条线装饰添加动画效果?

4

有没有一种方法可以通过透明度属性来动画化装饰器,使得线条从略带红色的颜色变为完全的红色?

我在我的OnRender()方法中有以下代码:

Pen renderPen = new Pen(new SolidColorBrush(Colors.Red), 2.5);
drawingContext.DrawLine(renderPen, adornedElementRect.Value.TopLeft, adornedElementRect.Value.BottomLeft);

谢谢你

1个回答

7

以下是一个例子:点击按钮,红色线条将会渐隐渐现。

窗口的 XAML 代码:

<Window x:Class="AnimAdornerTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Width="100" Height="30" 
                HorizontalAlignment="Left" 
                VerticalAlignment="Top" Click="Button_Click">Show Adorner</Button>
        <Rectangle x:Name="toBeAdorned" Fill="#E8E8E8" Width="100" Height="100"></Rectangle>
    </Grid>
</Window>

窗口的代码后台:

using System.Windows;
using System.Windows.Documents;

namespace AnimAdornerTest
{
    public partial class MainWindow : Window
    {
        private AdornerLayer _adornerLayer;
        private AnimAdorner _adorner;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (_adornerLayer == null)
            {
                _adornerLayer = AdornerLayer.GetAdornerLayer(toBeAdorned);
            }
            if (_adorner != null)
            {
                _adornerLayer.Remove(_adorner);
            }
            _adorner = new AnimAdorner(toBeAdorned);
            _adornerLayer.Add(_adorner);
        }
    }
}

装饰器:

using System;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace AnimAdornerTest
{
    public class AnimAdorner : Adorner
    {
        public AnimAdorner(UIElement adornedElement) : base(adornedElement)
        {
            Loaded += AnimAdorner_Loaded;
        }

        void AnimAdorner_Loaded(object sender, RoutedEventArgs e)
        {
            DoubleAnimation myDoubleAnimation = new DoubleAnimation
                {
                    From = 1.0,
                    To = 0.0,
                    Duration = new Duration(TimeSpan.FromSeconds(1)),
                    AutoReverse = true,
                    RepeatBehavior = RepeatBehavior.Forever
                };

            Storyboard myStoryboard = new Storyboard();
            myStoryboard.Children.Add(myDoubleAnimation);
            Storyboard.SetTarget(myStoryboard, this);
            Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(OpacityProperty));

            myStoryboard.Begin(this);
        }

        protected override void OnRender(DrawingContext drawingContext)
        {
            Pen renderPen = new Pen(new SolidColorBrush(Colors.Red), 2.5);
            drawingContext.DrawLine(renderPen, new Point(0, 0), new Point(AdornedElement.RenderSize.Width, AdornedElement.RenderSize.Height));
        }

    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接