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