AvalonEdit を使用して、適切に色分けし、下線や反転などのいくつかのスタイルを実装する ANSI 端末を作成しています (これは完全な VT100 の種類ではありません)。
AvalonEdit では、DocumentColorizingTransformer
ANSI カラー コードを色付きテキストまたはスタイル付きテキストに変換します。昨夜、私は ANSI Blink の実装に取り組んでいました。私はこのコードセクションでまばたきをしました:
else if (color.AnsiColor is Blink)
{
// The color animation of the pulse, use the opacity to simulate blinking
var da = new DoubleAnimation
{
Duration = new Duration(TimeSpan.FromMilliseconds(500)),
From = 0,
To = 1,
AutoReverse = true
RepeatBehavior = RepeatBehavior.Forever
};
// Get the foreground
var foreground = element.TextRunProperties.ForegroundBrush;
// Clone the foreground so it's not frozen and we can run animations on it.
var blinkForeground = foreground.Clone();
// Set the new foreground.
element.TextRunProperties.SetForegroundBrush(blinkForeground);
// Blink Blink Blink Blink
blinkForeground.BeginAnimation(SolidColorBrush.OpacityProperty, da);
}
明らかに、このテキストが画面上にある間は永遠に点滅したいので、 RepeatBehavior を永遠に設定します。ただし、画面の表示部分からスクロールされた後も CPU を使用し続けます (レンダリングされていない可能性がありますが、アニメーションはまだ実行されているようです)。
私の質問:
表示されているビューからスクロールアウトされたときに、テキストの一部でアニメーションを停止するにはどうすればよいですか (AvalonEdit ボックスですべてを通過する必要はありません。非常に大きく、パフォーマンスを向上させるのは現実的ではありません)。 . アニメーションが画面から消えたときにアニメーションを停止し、ColorizeLine(DocumentLine line)
火災が発生したときに再開できれば理想的です。AvalonEdit を使用すると、何かが通過したときにColorizeLine
それが表示されていることがわかりますが、その時点で何が表示されていないかは必ずしもわかりません。すべての二重アニメーションへの参照のリストを保持することを検討しましたが、それらがいつ画面に表示されるかはまだわかりません。
これにどのようにアプローチできるかについて、他のアイデアや考えはありますか?