0

そのため、ここ 1 日か 2 日は、依存関係プロパティとルーティングされたコマンドに触れ、別のプロジェクトでのコンテンツ スケーリングの問題を解決するためにサンプル コードの一部を活用するために、この記事を研究していました。そのプロジェクトはたまたま vb.net で書かれており、このサンプル コードは C# です。

オッケー、問題ないよ。私が見たほとんどのチュートリアルとデモ プロジェクトでは C# が使用されています。コードを読んで vb.net に同等のものを記述することは、実際に何が起こっているのかを理解し、どちらかをより快適に使用できるようにするための非常に良い方法であることがわかりました。時間はかかりますが、私の経験レベルでは価値があります (#00FF00)

コールバック メソッドを使用したイベントで問題が発生するまで、それほど時間はかかりませんでした。次の方法を検討してください。

public static class AnimationHelper
{

...

public static void StartAnimation(UIElement animatableElement,
                                  DependencyProperty dependencyProperty,
                                  double toValue,
                                  double animationDurationSeconds,
                                  EventHandler completedEvent)
{
    double fromValue = (double)animatableElement.GetValue(dependencyProperty);

    DoubleAnimation animation = new DoubleAnimation();
    animation.From = fromValue;
    animation.To = toValue;
    animation.Duration = TimeSpan.FromSeconds(animationDurationSeconds);

    animation.Completed += delegate(object sender, EventArgs e)
    {
        //
        // When the animation has completed bake final value of the animation
        // into the property.
        //
        animatableElement.SetValue(dependencyProperty, animatableElement.GetValue(dependencyProperty));
        CancelAnimation(animatableElement, dependencyProperty);

        if (completedEvent != null)
        {
            completedEvent(sender, e);
        }
    };

    animation.Freeze();

    animatableElement.BeginAnimation(dependencyProperty, animation);
}

DoubleAnimation の Completed イベントとコールバック メソッドを適切に処理する方法を除けば、このメソッドを vb.net に書き写すのは簡単です。私の最善の試みは次のようになります。

Public NotInheritable Class AnimationHelper

...

Public Shared Sub StartAnimation(...)

...

animation.Completed += Function(sender As Object, e As EventArgs)

            animatableElement.SetValue(dependencyProperty, animatableElement.GetValue(dependencyProperty))
            CancelAnimation(animatableElement, dependencyProperty)
            RaiseEvent completedEvent(sender, e)
        End Function
...

End Sub

これにより、次の 2 つの苦情が発生します。

  1. 「completedEvent」は [namespace].AnimationHelper のイベントではありません

  2. 「Public Event Completed(...)」はイベントであり、直接呼び出すことはできません。RaiseEventを使用...

(1) は、メソッド宣言のパラメーターの 1 つが completedEvent (As EventHandler) であるため、私には少し謎です。行の先頭から RaiseEvent を削除し、通常のメソッドのように呼び出すことは、ビジュアル スタジオを満足させるように見えますが、それが実行時に機能するかどうか、またはそれが有効かどうかはまったくわかりません。(2) の構文は私には疑わしいように見えますが、RaiseEvent を行頭に追加すると、(1) と同様の苦情が発生します。

vb.net のデリゲートとイベントに関する優れた入門書を求めて、スタックとより大きなインターネットを精査し続けるつもりです。それまでの間、アドバイス/提案は大歓迎です。

4

2 に答える 2

0
  1. なぜそのイベント ハンドラーを発生させようとするのですか? AnEventHandlerは単なるデリゲートです。C# のように実行するだけです。

    if completedEvent IsNot Nothing then
        completedEvent(sender, e)
    end if
    
于 2012-08-23T20:05:25.833 に答える
0

ここでの主な問題は、VB の方法でハンドラーを追加していないことだと思いますAddHandler。コードを次のように書き換えると:

Dim handler As EventHandler = Sub(sender, e)
    x.SetValue(dependencyProperty, x.GetValue(dependencyProperty))
    CancelAnimation(x, dependencyProperty)
    ' See note below...
    RaiseEvent completedEvent(sender, e)
End Sub

AddHandler animation.Completed, handler

...うまくいくと思います。その部分がまだ問題を引き起こすかどうかは明らかではありませんRaiseEventが、少なくともサブスクライブすることは問題animation.Completedないはずです. パーツが問題を引き起こす場合は、RaiseEventダニエルの回答に従ってデリゲートを直接呼び出します。

デリゲートは何も返さないため、Subではなく hereを使用していることに注意してください。Function

于 2012-08-23T20:05:42.487 に答える