2

Microsoft の Expression Blend 3 SketchFlow アプリケーション。

テキストのタイピングをアニメーション化するにはどうすればよいでしょうか。理想的には、文字ごとにステージングされます。ユーザーが入力しているかのように。

関連する点滅するカーソルがあれば完璧ですが、それは「あると便利」の領域にはほど遠いものです。

キーフレーム アニメーション システムでは、

共通プロパティ > テキスト

そのため、アニメーションのそのキーフレームで記録された変更として保持されません。

エディターの手順 (ある種の他のコントロールを使用) または XAML コードを探しています...

<VisualState>
    <StoryBoard>
        <DoubleAnimationUsingKeyFrame ... >
4

1 に答える 1

3

テキスト ブロック上の四角形のワイプ アニメーションを含むソリューションでこれについてブログを書いた後、テキスト ブロックにアタッチされたカスタム ビヘイビアーを使用するより高度なソリューションを含む応答ブログ投稿が作成されました。

「TypeOnAction」ビヘイビアーを作成して TextBlock に追加すると、カスタマイズ可能な出現率で、文字ごとに表示する目的の効果が得られます。完全なコード サンプルはこちらから入手できます。

public class TypeOnAction : TriggerAction<TextBlock>
{
    DispatcherTimer timer;
    int len = 1;

    public TypeOnAction()
    {
        timer = new DispatcherTimer();
    }

    protected override void Invoke(object o)
    {
        if (AssociatedObject == null)
            return;

        AssociatedObject.Text = "";
        timer.Interval = TimeSpan.FromSeconds(IntervalInSeconds);
        timer.Tick += new EventHandler(timer_Tick);
        len = 1;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        if (len > 0 && len <= TypeOnText.Length)
        {
            AssociatedObject.Text = TypeOnText.Substring(0, len);
            len++;
            timer.Start();
        }
        else
            timer.Stop();
    }

    public string TypeOnText
    {
        get { return (string)GetValue(TypeOnTextProperty); }
        set { SetValue(TypeOnTextProperty, value); }
    }

    public static readonly DependencyProperty TypeOnTextProperty =
        DependencyProperty.Register("TypeOnText", typeof(string), typeof(TypeOnAction), new PropertyMetadata(""));

    public double IntervalInSeconds
    {
        get { return (double)GetValue(IntervalInSecondsProperty); }
        set { SetValue(IntervalInSecondsProperty, value); }
    }

    public static readonly DependencyProperty IntervalInSecondsProperty =
        DependencyProperty.Register("IntervalInSeconds", typeof(double), typeof(TypeOnAction), new PropertyMetadata(0.35));

}
于 2009-08-25T01:17:35.877 に答える