所以在过去的一两天里,我一直在研究这篇文章,以便了解依赖属性和路由命令,并希望利用一些示例代码来解决另一个项目中的内容缩放问题。该项目恰好是用 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
这导致了两个投诉:
'completedEvent' 不是 [namespace].AnimationHelper 的事件
'Public Event Completed(...)' 是一个事件,不能直接调用。使用 RaiseEvent...
(1) 对我来说有点神秘,因为 completedEvent (As EventHandler) 是方法声明中的参数之一。从行首删除 RaiseEvent 并像普通方法一样调用它似乎满足了 Visual Studio,但我不知道这是否会在运行时工作,或者这样做是否有效。在 (2) 中,语法对我来说很可疑,将 RaiseEvent 添加到行首会导致类似于 (1) 的类似投诉。
我将继续在堆栈和更大的互联网上寻找关于 vb.net 中代表和事件的良好入门,因为显然是时候我停止避免学习它们是如何工作的了。同时,建议/建议是最受欢迎的。