そのため、ここ 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 つの苦情が発生します。
「completedEvent」は [namespace].AnimationHelper のイベントではありません
「Public Event Completed(...)」はイベントであり、直接呼び出すことはできません。RaiseEventを使用...
(1) は、メソッド宣言のパラメーターの 1 つが completedEvent (As EventHandler) であるため、私には少し謎です。行の先頭から RaiseEvent を削除し、通常のメソッドのように呼び出すことは、ビジュアル スタジオを満足させるように見えますが、それが実行時に機能するかどうか、またはそれが有効かどうかはまったくわかりません。(2) の構文は私には疑わしいように見えますが、RaiseEvent を行頭に追加すると、(1) と同様の苦情が発生します。
vb.net のデリゲートとイベントに関する優れた入門書を求めて、スタックとより大きなインターネットを精査し続けるつもりです。それまでの間、アドバイス/提案は大歓迎です。