动画制作时,自定义面板布局无法正常工作(WPF)

时间:2012-04-04 22:01:30

标签: wpf layout wpf-controls

我有一个自定义(并且变得复杂)TabControl。这是许多来源的聚集,加上我自己想要的功能。在它中是一个自定义Panel来显示TabControl的标题。它的功能是压缩TabItems的大小,直到它们达到最小值,然后激活滚动功能(再次在Panel中)。还有另一个自定义面板可以容纳一个按钮,该按钮呈现在TabItems的右侧(这是一个“新标签”按钮)。

这一切都很有效,直到我尝试为滚动设置动画。

以下是一些相关摘要:

在CustomTabPanel中(C#,覆盖Panel并实施IScrollInfo):

private readonly TranslateTransform _translateTransform = new TranslateTransform();

public void LineLeft()
{
    FirstVisibleIndex++;

    var offset = HorizontalOffset + _childRects[0].Width;
    if (offset < 0 || _viewPort.Width >= _extent.Width)
        offset = 0;
    else
    {
        if (offset + _viewPort.Width > _extent.Width)
            offset = _extent.Width - _viewPort.Width;
    }

    _offset.X = offset;
    if (_scrollOwner != null)
        _scrollOwner.InvalidateScrollInfo();

    //Animate the new offset
    var aScrollAnimation = new DoubleAnimation(_translateTransform.X, -offset,
                                           new Duration(this.AnimationTimeSpan), FillBehavior.HoldEnd) { AccelerationRatio = 0.5, DecelerationRatio = 0.5 };
    aScrollAnimation.Completed += ScrollAnimationCompleted;

    _translateTransform.BeginAnimation(TranslateTransform.XProperty, aScrollAnimation , HandoffBehavior.SnapshotAndReplace);

    //End of animation

    // These lines are the only ones needed if we remove the animation
    //_translateTransform.X = -offset;
    //InvalidateMeasure();
}


void ScrollAnimationCompleted(object sender, EventArgs e)
{
    InvalidateMeasure();
}

_translateTransform在构造函数中初始化:

    base.RenderTransform = _translateTransform;

同样,如果我移除动画部分并将其替换为末尾注释掉的行,一切都会好的。

我还必须指出问题不在于动画本身。那部分效果很好。问题是当我删除一些标签项时:所有布局然后搞砸了。 TranslateTransformation似乎存在一些错误的价值或其他东西。

提前致谢。

1 个答案:

答案 0 :(得分:0)

好。通常情况下,我一直在努力,并且......自己回答。

仍然可以对其他人有用,所以这里是抓住了。在该行:

var aScrollAnimation = new DoubleAnimation(_translateTransform.X, -offset, new Duration(this.AnimationTimeSpan), FillBehavior.HoldEnd)
    { AccelerationRatio = 0.5, DecelerationRatio = 0.5 };

FillBehavior应该是FillBehavior.Stop

就这么简单!