我想使用Track-Bar
来更改Form
的不透明度。
这是我的代码:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
当我构建应用程序时,它给出以下错误:
无法将类型隐式转换
decimal
为double
我已经尝试过使用trans
,double
但随后Control
却无法正常工作。该代码在过去的VB.NET项目中运行良好。
我想使用Track-Bar
来更改Form
的不透明度。
这是我的代码:
decimal trans = trackBar1.Value / 5000;
this.Opacity = trans;
当我构建应用程序时,它给出以下错误:
无法将类型隐式转换
decimal
为double
我已经尝试过使用trans
,double
但随后Control
却无法正常工作。该代码在过去的VB.NET项目中运行良好。
Answers:
您的代码在VB.NET中可以正常工作,因为它隐式地执行任何强制转换,而C#同时具有隐式和显式强制转换。
在C#中,由于精度下降,从十进制到双精度的转换是明确的。例如,1.1不能精确地表示为双精度数,而可以精确地表示为十进制数(请参阅“ 浮点数-比您想象的更不准确 ”,以了解原因)。
在VB中,编译器为您添加了转换:
decimal trans = trackBar1.Value / 5000m;
this.Opacity = (double) trans;
这(double)
必须在C#中明确声明,但是可以由VB的“更宽容”的编译器隐含。
为什么要除以5000?只需将TrackBar的最小值和最大值设置为0到100之间,然后将不透明度百分比的值除以100。下面的最少20个示例可防止表单变得完全不可见:
private void Form1_Load(object sender, System.EventArgs e)
{
TrackBar1.Minimum = 20;
TrackBar1.Maximum = 100;
TrackBar1.LargeChange = 10;
TrackBar1.SmallChange = 1;
TrackBar1.TickFrequency = 5;
}
private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
this.Opacity = TrackBar1.Value / 100;
}
5000
OP可能会出现问题,而不是出现问题100
?
你有两个问题。首先,Opacity
需要一个双精度值,而不是十进制值。编译器告诉您,虽然在十进制和双精度之间进行了转换,但这是您需要指定的显式转换,以使其起作用。第二个是TrackBar.Value
整数值,将int除以int都会得到int,无论您将变量分配给哪种类型。在这种情况下,存在从int到十进制或double的隐式转换-因为执行转换时不会损失精度-因此编译器不会抱怨,但是您得到的值始终为0,大概是因为trackBar.Value
始终小于5000。解决方案是将代码更改为使用double(Opacity的本机类型),并通过将常量显式设置为double来进行浮点算术-这将促进算术-或强制转换trackBar.Value
为double ,它们会做同样的事情-或两者都做。哦,除非您在其他地方使用中间变量,否则您不需要中间变量。我的猜测是,无论如何编译器都会对其进行优化。
trackBar.Opacity = (double)trackBar.Value / 5000.0;
听起来像是this.Opacity
一个双精度值,并且编译器不喜欢您尝试将十进制值填充到其中。
该不透明度属性为双类型:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
或者简单地:
this.Opacity = trackBar1.Value / 5000.0;
要么:
this.Opacity = trackBar1.Value / 5000d;
请注意,我正在使用5000.0
(或5000d
)强制执行双除法,因为trackBar1.Value
它是整数,它将执行整数除法,结果将是整数。
假设您使用的是WinForms,Form.Opacity
类型为double
,那么您应该使用:
double trans = trackBar1.Value / 5000.0;
this.Opacity = trans;
除非您在其他地方需要该值,否则编写起来会更简单:
this.Opacity = trackBar1.Value / 5000.0;
当您将代码更改为简单的两倍时,该控件不起作用的原因是:
double trans = trackbar1.Value / 5000;
将其解释5000
为整数,并且由于trackbar1.Value
也是整数,您的trans
值始终为零。通过将数字加一个显式的浮点值,.0
编译器现在可以将其解释为双精度型并执行适当的计算。
this.Opacity = trackBar1.Value / 5000d;