动画师控制的透明度

时间:2012-11-30 17:29:26

标签: wpf user-controls transparency

我正在为动画编写用户控件 它使用内部ImageList来存储动画图像,并在循环中一个接一个地绘制 这是整个代码:

public partial class Animator : UserControl
{
    public event EventHandler OnLoopElapsed = delegate { };
    private ImageList imageList = new ImageList();
    private Timer timer;
    private bool looping = true;
    private int index;
    private Image newImage;
    private Image oldImage;

    public Animator()
    {
        InitializeComponent();

        base.DoubleBuffered = true;

        timer = new Timer();
        timer.Tick += timer_Tick;
        timer.Interval = 50;
    }

    public bool Animate
    {
        get { return timer.Enabled; }
        set
        {
            index = 0;
            timer.Enabled = value;
        }
    }

    public int CurrentIndex
    {
        get { return index; }
        set { index = value; }
    }

    public ImageList ImageList
    {
        set
        {
            imageList = value;
            Invalidate();
            index = 0;
        }

        get { return imageList; }
    }

    public bool Looping
    {
        get { return looping; }
        set { looping = value; }
    }

    public int Interval
    {
        get { return timer.Interval; }
        set { timer.Interval = value; }
    }

    private void timer_Tick(object sender, EventArgs e)
    {
        if (imageList.Images.Count == 0)
            return;

        Invalidate(true);
        index++;

        if (index >= imageList.Images.Count)
        {
            if (looping)
                index = 0;
            else
                timer.Stop();

            OnLoopElapsed(this, EventArgs.Empty);
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
        if (oldImage != null)
            e.Graphics.DrawImage(oldImage, ClientRectangle);
        else
            e.Graphics.Clear(BackColor);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        Graphics g = e.Graphics;

        if (imageList.Images.Count > 0)
        {
            newImage = imageList.Images[index];
            g.DrawImage(newImage, ClientRectangle);
            oldImage = newImage;
        }
        else
        {
            e.Graphics.Clear(BackColor);
        }
    }
}

动画看起来非常漂亮和顺畅 但问题是其周围的矩形被漆成黑色 我在这里缺少什么?

我在WPF中看到非常流畅的透明动画here
我已经在它后面放了一些标签,我希望它们可以通过旋转轮看到它们 但我不太清楚WPF在WPF中构建这样的控件。

任何想法或WPF示例代码都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

这是通过从构造函数中删除此行来解决的:

base.DoubleBuffered = true;

现在控件完全透明,即使在更改图像时也是如此。