是否可以从另一个类修改表单的属性

时间:2014-11-01 05:17:22

标签: c# forms opacity

有没有办法从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循环单独工作正常。

有解决这种困境的方法吗?

1 个答案:

答案 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