web-dev-qa-db-ja.com

フォームに点滅するラベルを実装する方法

メッセージのキューとこのメッセージを変更できる数を表示するフォームがあります。フォームの使いやすさを向上させるためにメッセージの数が増えたときに、ラベル(キューの長さ)を点滅させたいのですが。カスタムコントロールを実装し、追加のスレッドまたはタイマーを使用してラベルの色を変更する必要がありますか?誰かがそのような機能を実装しましたか?そのような振る舞いを実装するための最良のソリューション(リソースとパフォーマンスの低下が少ない)は何ですか?

解決策:

タイマー付きのフォームのコンポーネント 1秒あたりのアニメーションの数を制限する で、外部コントロールの背景色にフェードアウト効果を実装できます。

15
garik

点滅を開始するためのカスタムコンポーネントとイベントを作成できます。良い解決策だと思います。タイマーで実装できる点滅。

2

以下はasyncawaitを使用して点滅しています

private async void Blink(){
    while (true){
        await Task.Delay(500);
        label1.BackColor = label1.BackColor == Color.Red ? Color.Green : Color.Red;
    }
}
24
MusuNaji
_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()をスローすることもできます。

14
user501211

私はこれが本当に古い投稿であることを知っていますが、投稿されたブール解よりも少し多目的なものを探している人は、以下のことを利用するかもしれません: enter image description here

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);
13
Jim Simson

アニメーション.gif代わりに(おそらく数の背景として)?古い学校のWebページのように見えますが、機能する可能性があります。

3
vlad

独自のUserControlを作成します。これは、Labelから直接継承するのではなく、Controlから継承します。 StartBlinkingメソッドを追加します。このメソッドでは、ティックイベントがラベルのスタイルを変更するTimerオブジェクトを開始します(点滅効果を作成するために、BackgroundColorプロパティとForegroundColorプロパティを毎回変更します)。

StopBlinkingメソッドを追加してオフにすることもできます。あるいは、おそらく5秒後にTimerを自動的に停止させることもできます。

3
MusiGenesis

ここでは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";
        }
    }
0
Parag555