正确/不正确使用委托以实现可扩展性

时间:2012-05-20 00:59:48

标签: c# generics animation delegates code-reuse

我正在尝试为我的GUI库用户提供无限制的输入/输出过渡效果自定义,同时仍然保持简单性/防止滥用(当控件进入或退出视图时)。

为此,我向Control类添加了一个委托,它将获取Control引用和转换完成百分比,以便用户能够以他想要的任何方式平滑地转换控件的位置/不透明度,基于给定的百分比。他所要做的就是在控制进入/退出之前订阅过渡功能。

然而,我意识到仅使用当前完成百分比来转换/动画控件是不可能的,因为您还必须存储和比较控件的初始位置。
为了明确这个存储要求,我应该强制使用委托函子吗?

如果是这样,我怎么能以简约/干净的方式做到这一点?


随意建议另一种方式允许用户应用自定义过渡动画!

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你的Control会调用动画(计算)委托(不时,可能在每一帧)并传递转换竞争百分比。 然后,动画委托计算并返回/应用平移和位置到控件。 这是对的吗?

假设以上是正确的,有几种解决方案:

  1. 仅设置位置和不透明度时的动画:

    除了竞争百分比之外,您还必须在调用委托时发送初始控制状态和不透明度。必须记住转换开始时的初始状态,并在每次通话中发送给委托。

  2. 一般动画任意属性:

    除了竞争百分比,你还提供国家财产(对象类型甚至更好的词典)。这个State属性完全由委托及其动画逻辑控制。

    对于您的Control,State属性没有任何语义或含义。 您的控件只能在后续的委托调用之间保留State属性的值。

    将所有内容放在一起,Delegate在第一次调用时向State填充初始值,在后续调用中使用这些值 - 做任何想做的事情。 Delegate还将计算值应用于Control。请注意,可以在委托中使用的所有属性都必须是公共的。

答案 1 :(得分:1)

IMO您无需为控件的用户提供控件的初始位置,因为他可以将其相对于初始位置定位: 负数表示左侧和顶部,正数表示右侧和底部。

以下代码是快速转换的函数:

Point FastTranDiagonial(float Percentage){
   Thread.Sleep(10);
   int pixelsDist = (1 - Percentage)* 300;//300 is the maximum distance 
   return new Point(-pixelsDist ,pixelsDist);
}

调用委托时,必须将Point添加到控件的初始位置。你必须注意到委托包含一个Thread.Sleep(X),它必须控制用户,因为他可能想要做一个快速或慢速的事务。

你可能还想考虑添加像jQuery这样的顺序转换,这样一个转换就会在另一个转换完成后开始。

祝你好运

答案 2 :(得分:0)

我认为您需要将至少以下参数传递给委托: -

  • 控件本身
  • 包含控件的容器(例如面板)
  • 完成百分比

通过传递控件本身,用户将获得其所有初始状态信息(例如位置)。此外,如果用户需要设置控件的任何属性,他肯定需要对控件本身的引用。

如果用户需要其尺寸/位置信息,或者他需要为控件执行特殊操作,则可能需要该容器。