有没有办法从C#项目中的单独类修改Form的属性?具体来说,我试图用这个来完成的是能够为几个表单添加淡入淡出的功能,而无需为每个类重新定义方法和循环。相反,我想将此方法(称为FadeInWindow()
)放在一个名为SharedMemory
的单独类中,并为了简单起见,使所有表单都可以访问它。
因此,我不必在每个表单中构建类以访问SharedMemory
的内容,我使用static
修饰符声明其内容。
这是我的淡入淡出循环方法,位于SharedMemory
类:
public static void FadeInWindow(Form form, double opacity)
{
for (double i = 0; i < opacity; opacity += 0.05)
{
form.Opacity = i;
form.Refresh();
System.Threading.Thread.Sleep(10);
}
}
我使用this
关键字将表单插入到方法中。 opacity
参数定义了Form的理论不透明度级别的最大限制。放置在表单而不是for
中时,SharedMemory
循环单独工作正常。
有解决这种困境的方法吗?
答案 0 :(得分:3)
两点:
首先,你没有增加你在for循环中定义的值。您将传递给方法的Form的不透明度定义为i,但增量部分是不透明度+ = 0.05。你的for循环永远不会结束,传递给FadeInWindow的表单的不透明度永远不会变化。我想如果您解决了这个问题,您会发现您的表单已根据需要更新。
其次,你不应该在你的for循环中使用双打作为你的计数器。在这种情况下,这不会导致问题,但最好不要养成使用它们的习惯。这可能导致您失败的一个示例如下:
for (double i = 0; i <= 1.0; i += 0.1) { }
取决于任何特定实现如何舍入浮点,这可以执行9次或10次。 (提示 - 根据我在下面的链接,这只在VS2013中执行了9次,所以这是直接相关的。)浮点运算并不像整数加法那样可预测(这在完全加法的最小和最大范围内是完全可预测的)类型)。相反,如果你想获得0.05的倍数,你应该做以下事情:
for (int i = 0; i < 10; i++)
{
double currentOpacity = (double)i * 0.05;
}
这将始终执行10次。
比我更聪明的人解释问题here。