2012-04-04 9 views
0

私はカスタム(複雑なもの)TabControlを持っています。それは、多くの情報源を集めたものであり、自分の望む機能を集めたものです。 TabControlのヘッダを表示するのはカスタムPanelです。その機能は、最小値に達するまでTabItemsのサイズを圧縮した後、スクロール機能をアクティブにします(Panel内で再び機能します)。 TabItems(これは「新しいタブ」ボタンです)の右側に表示される1つのボタンを保持する別のカスタムパネルもあります。アニメーション化(WPF)時にカスタムパネルレイアウトが正常に動作しない

スクロールをアニメーション化しようとするまで、すべてがうまくいきます。 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は何らかの間違った価値などを持っているようです。

ありがとうございます。

答えて

0

それはしばしばそうであるように、私はその事に取り組んで、そして...自分自身に答えました。

他の人にはまだ役立つかもしれないので、ここにキャッチがありました。ラインで:

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

FillBehaviorFillBehavior.Stopされている必要があります。

それだけ簡単です!

関連する問題