0

所以在过去的一两天里,我一直在研究这篇文章,以便了解依赖属性和路由命令,并希望利用一些示例代码来解决另一个项目中的内容缩放问题。该项目恰好是用 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);
}

将此方法转录到 vb.net 很简单,除了正确处理 DoubleAnimation 的 Completed 事件和回调方法的方法。我最好的尝试如下:

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

这导致了两个投诉:

  1. 'completedEvent' 不是 [namespace].AnimationHelper 的事件

  2. 'Public Event Completed(...)' 是一个事件,不能直接调用。使用 RaiseEvent...

(1) 对我来说有点神秘,因为 completedEvent (As EventHandler) 是方法声明中的参数之一。从行首删除 RaiseEvent 并像普通方法一样调用它似乎满足了 Visual Studio,但我不知道这是否会在运行时工作,或者这样做是否有效。在 (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部分导致问题,请按照 Daniel 的回答直接调用委托。

请注意使用Subhere 而不是Function,因为委托不返回任何内容。

于 2012-08-23T20:05:42.487 回答