0

AvalonEdit を使用して、適切に色分けし、下線や反転などのいくつかのスタイルを実装する ANSI 端末を作成しています (これは完全な VT100 の種類ではありません)。

AvalonEdit では、DocumentColorizingTransformerANSI カラー コードを色付きテキストまたはスタイル付きテキストに変換します。昨夜、私は 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それが表示されていることがわかりますが、その時点で何が表示されていないかは必ずしもわかりません。すべての二重アニメーションへの参照のリストを保持することを検討しましたが、それらがいつ画面に表示されるかはまだわかりません。

これにどのようにアプローチできるかについて、他のアイデアや考えはありますか?

4

1 に答える 1