メッセージのキューとこのメッセージを変更できる数を表示するフォームがあります。フォームの使いやすさを向上させるためにメッセージの数が増えたときに、ラベル(キューの長さ)を点滅させたいのですが。カスタムコントロールを実装し、追加のスレッドまたはタイマーを使用してラベルの色を変更する必要がありますか?誰かがそのような機能を実装しましたか?そのような振る舞いを実装するための最良のソリューション(リソースとパフォーマンスの低下が少ない)は何ですか?
解決策:
タイマー付きのフォームのコンポーネント 1秒あたりのアニメーションの数を制限する で、外部コントロールの背景色にフェードアウト効果を実装できます。
点滅を開始するためのカスタムコンポーネントとイベントを作成できます。良い解決策だと思います。タイマーで実装できる点滅。
以下はasync
とawait
を使用して点滅しています
private async void Blink(){
while (true){
await Task.Delay(500);
label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
}
}
_Timer timer = new Timer();
timer.Interval = 500;
timer.Enabled = false;
timer.Start();
if( messagesNum > oldMessagesNum)
timer.Tick += new EventHandler( timer_Tick );
else
timer.Tick -= timer_Tick;
void timer_Tick( object sender, EventArgs e )
{
if(messageLabel.BackColor == Color.Black)
messageLabel.BackColor = Color.Red;
else
messageLabel.BackColor = Color.Black;
}
_
これは、フォーム内で機能するかなり単純な実装です。同じコードでカスタムコントロールを作成し、そのコントロールのメソッドにTimer.Start()
をスローすることもできます。
私はこれが本当に古い投稿であることを知っていますが、投稿されたブール解よりも少し多目的なものを探している人は、以下のことを利用するかもしれません:
using System.Diagnostics;
using System.Threading.Tasks;
private async void SoftBlink(Control ctrl, Color c1, Color c2, short CycleTime_ms, bool BkClr)
{
var sw = new Stopwatch(); sw.Start();
short halfCycle = (short)Math.Round(CycleTime_ms * 0.5);
while (true)
{
await Task.Delay(1);
var n = sw.ElapsedMilliseconds % CycleTime_ms;
var per = (double)Math.Abs(n - halfCycle) / halfCycle;
var red = (short)Math.Round((c2.R - c1.R) * per) + c1.R;
var grn = (short)Math.Round((c2.G - c1.G) * per) + c1.G;
var blw = (short)Math.Round((c2.B - c1.B) * per) + c1.B;
var clr = Color.FromArgb(red, grn, blw);
if (BkClr) ctrl.BackColor = clr; else ctrl.ForeColor = clr;
}
}
あなたはそのように呼び出すことができます:
SoftBlink(lblWarning, Color.FromArgb(30, 30, 30), Color.Red,2000,false);
SoftBlink(lblSoftBlink, Color.FromArgb(30, 30, 30), Color.Green, 2000,true);
アニメーション.gif
代わりに(おそらく数の背景として)?古い学校のWebページのように見えますが、機能する可能性があります。
独自のUserControl
を作成します。これは、Label
から直接継承するのではなく、Control
から継承します。 StartBlinking
メソッドを追加します。このメソッドでは、ティックイベントがラベルのスタイルを変更するTimer
オブジェクトを開始します(点滅効果を作成するために、BackgroundColorプロパティとForegroundColorプロパティを毎回変更します)。
StopBlinking
メソッドを追加してオフにすることもできます。あるいは、おそらく5秒後にTimer
を自動的に停止させることもできます。
ここではTimer
クラスを使用できます。ここで私が実装したもの。 Button_clickイベントで点滅するラベルの色。
//click event on the button to change the color of the label
public void buttonColor_Click(object sender, EventArgs e)
{
Timer timer = new Timer();
timer.Interval = 500;// Timer with 500 milliseconds
timer.Enabled = false;
timer.Start();
timer.Tick += new EventHandler(timer_Tick);
}
void timer_Tick(object sender, EventArgs e)
{
//label text changes from 'Not Connected' to 'Verifying'
if (labelFirst.BackColor == Color.Red)
{
labelFirst.BackColor = Color.Green;
labelFirst.Text = "Verifying";
}
//label text changes from 'Verifying' to 'Connected'
else if (labelFirst.BackColor == Color.Green)
{
labelFirst.BackColor = Color.Green;
labelFirst.Text = "Connected";
}
//initial Condition (will execute)
else
{
labelFirst.BackColor = Color.Red;
labelFirst.Text = "Not Connected";
}
}