私はカスタムを持っています(そして複雑になっています)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 は、間違った値か何かを保持しているようです。
前もって感謝します。