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

本文关键字:实现 可扩展性 不正确 正确地 正确 | 更新日期: 2023-09-27 18:34:54

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

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

但是,我意识到仅使用当前完成百分比无法转换/动画控件,因为您还必须存储和比较控件的初始位置。
为了使此存储要求显而易见,我是否应该强制使用委托函子?

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


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

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

如果我理解正确,您的控件会调用动画(计算(委托(不时,可能在每一帧上(并通过过渡竞争百分比。然后,动画委托计算并向控件返回/应用平移和位置。这是对的吗?

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

  1. 仅对位置和不透明度进行动画处理时:

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

  2. 通常对任意属性进行动画处理时:

    除了竞争百分比之外,您还提供 State 属性(对象类型甚至更好的字典(。此 State 属性完全由委托及其动画逻辑控制。

    在您的控制范围内,State 财产将没有任何语义或意义。您的控件仅在后续委托调用之间保留 State 属性的值。

    综上所述,

    委托在第一次调用时用初始值填充状态,在后续调用中使用这些值 - 做任何它想做的事情。委托还将计算值应用于控件。请注意,可以在委托中使用的所有属性都必须是公共的。

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 这样的顺序转换,以便一个转换在另一个转换完成后开始。

祝你好运

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

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

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

如果用户需要容器的大小/位置信息,或者需要对控件执行某些特殊操作,则可能需要容器。