显示后的 Windows 窗体不透明度 - C#
Posted
技术标签:
【中文标题】显示后的 Windows 窗体不透明度 - C#【英文标题】:Windows Forms Opacity After Shown- C# 【发布时间】:2011-01-03 05:28:54 【问题描述】:我正在尝试使用 c# 淡入 windows 窗体,但在显示窗体后它似乎不起作用。我展示后是否可以更改表格的不透明度?
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;
namespace ToolStrip
public partial class Form1 : Form
Form ToolForm = new ToolForm();
Form PropForm = new PropertyGrid();
public Form1()
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
ToolForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
ToolForm.Owner = this;
ToolForm.Show();
ToolForm.Location = new Point(50, 50);
private void button2_Click(object sender, EventArgs e)
PropForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
PropForm.Owner = this;
PropForm.Show();
PropForm.Location = new Point(50, 50);
System.Timers.Timer aTimer = new System.Timers.Timer(10000);
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 2000;
aTimer.Enabled = true;
Console.WriteLine("Press the Enter key to exit the program.");
Console.ReadLine();
private void OnTimedEvent(object source, ElapsedEventArgs e)
PropForm.Opacity = PropForm.Opacity - 0.25;
Console.WriteLine(PropForm.Opacity);
【问题讨论】:
【参考方案1】:我已经让它在没有计时器的情况下工作:
int Loop = 0;
for (Loop = 100; Loop >= 5; Loop -= 10)
this.PropForm.Opacity = Loop / 95.0;
this.PropForm .Refresh();
System.Threading.Thread.Sleep(100);
但我似乎无法将此示例更改为淡入而不是淡出。
【讨论】:
【参考方案2】:使用您的代码(并创建其他必要的 Form 类),我在第一次触发计时器并调用事件处理程序时遇到跨线程异常,as Benny suggests。
更改您的代码以检查计时器事件处理程序中的InvokeRequired
,并在必要时使用Invoke
更改PropForm.Opacity
,这会导致在显示表单后根据需要更改不透明度。
请注意,您可能希望从 Opacity
或 0
开始,然后逐渐增加 - 否则您的表单将开始时完全稳定并逐渐淡出
我会顺便提一下,Opacity 对某些版本的 Windows 没有影响,尽管你说你有 Opacity 效果在其他地方工作,所以在这种情况下不应该是这样。
【讨论】:
【参考方案3】:因为您使用 System.Timers.Timer 这是一个多线程计时器,在它的 OnTimedEvent() 中它调用由另一个线程创建的控制,这会导致异常。
如果您使用 System.Windows.Forms.Timer,它将起作用。我测试了。
【讨论】:
它适用于我在上面代码中提到的其他形式。除了在我向他们展示后它不起作用。 同意,不透明度分配必须在 UI 线程上完成。通过将不透明度保持在 0 到 0.99 之间来避免现在出现的闪烁以上是关于显示后的 Windows 窗体不透明度 - C#的主要内容,如果未能解决你的问题,请参考以下文章
C#winform怎样等所有控件加载完再显示窗体?C#透明窗体显示时闪现黑块怎么解决?