0

我有一个习惯(并且变得复杂)TabControl。这是许多来源的集合,加上我自己想要的功能。自定义Panel显示 TabControl 的标题。它的功能是压缩 的大小TabItems直到它们达到最小值,然后激活滚动功能(再次在面板中)。还有另一个自定义面板可以容纳一个按钮,它呈现在右侧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 似乎保留了一些错误的值或其他东西。

提前致谢。

4

1 回答 1

0

好。通常情况下,我一直在做这件事,然后……回答自己。

对其他人仍然有用,所以这里有一个问题。在行中:

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

FillBehavior应该是的FillBehavior.Stop

就这么简单!

于 2012-04-04T22:58:46.520 回答