どんなプログラム"フラッシュ効果"をアップデートされる際にはテキストボックスは、windowsフォルムC#?

StackOverflow https://stackoverflow.com/questions/4147169

質問

私はWindows、スレッドセーフで、C#、7つのテキストボックスに入力します。各テキストボックスを更新でに2-3その他の場合はその値を変更する、受け入れられる。何をしたいので何とか取れるテキストボックスに入力する必要のある更新して"フラッシュ"を光の色あります。目的は、ユーザーが何をしているの更新と追加の所。

さんが手軽に行うことができないことか思います。ご利用できますタイマーをループバックカラーの減少アルファチャンネルのテキストボックス制御の背景色と思うかもしれないけど、私はがきていることを確認して下さいしております。

jQuery UIは"ハイライト効果を示して私達成したいがたい鉱山を下).だけここに jQuery UIの効果デモページ, を選択し、"イ"から、ドロップダウンボックスのウィンドウをクリックし"Run効果があります。

編集
また、自分のソリューション自分の時間や資源の制約、テキストボックスをサポートしていない透明なデザイン-インスタレーションによるハンスPassant.なので、使用した自己停止タイマーを増加させるには、R、G、Bの値で制御で完全に白色または(R=255,G=255,B=255);

編集2
巻き上げを記録フラッシュのイベントとしての拡張手法を使用変化のジョージ-ジョンストンのソリューション後に更新しています。純4.0の製品をご用意しています。これはるかに洗浄液を感じ、拡張方法で自動的にどなたでもご利用いただく using ます。

役に立ちましたか?

解決

テキストボックスの点滅中にフォームが使用されるのをブロックしないように、フラッシュテキストボックスごとに別々のスレッドをスピンオフできます。スレッドの回転にはクロススレッドが必要なので、必ずフォームを呼び出してください。以下の完全な解決策。

private void Form1_Load(object sender, EventArgs e)
{
    // textBox1 is the control on your form.
    // 1000 is the total interval between flashes
    // Color.LightBlue is the flash color
    // 10 is the number of flashes before the thread quits.
    Flash(textBox1, 1000,Color.LightBlue,10);
    Flash(textBox2, 1500,Color.Green,10);
    Flash(textBox3, 100,Color.Red,10);
    Flash(textBox4, 500,Color.Brown,10);
    Flash(textBox5, 200,Color.Pink,10);
}

public void Flash(TextBox textBox, int interval, Color color, int flashes)
{
    new Thread(() => FlashInternal(textBox, interval, color, flashes)).Start();
}

private delegate void UpdateTextboxDelegate(TextBox textBox, Color originalColor);
public void UpdateTextbox(TextBox textBox, Color color)
{
    if (textBox.InvokeRequired)
    {
        this.Invoke(new UpdateTextboxDelegate(UpdateTextbox), new object[] { textBox, color });
    }
    textBox.BackColor = color;
}

private void FlashInternal(TextBox textBox, int interval, Color flashColor, int flashes)
{
    Color original = textBox.BackColor;
    for (int i = 0; i < flashes; i++)
    {

        UpdateTextbox(textBox, flashColor);
        Thread.Sleep(interval/2);
        UpdateTextbox(textBox, original);
        Thread.Sleep(interval/2);
    }
}

これにより、サポートするタイマーコントロールをフォームに配置する必要がなくなります。

他のヒント

のコンポーネントのラインナップが見られるように最適です。することで作ることができるのでコンポーネントのラインナップやポートとしてHostedElement.新規プロジェクトコンポーネントのラインナップユーザー制御、トー:

<UserControl x:Class="WpfControlLibrary1.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="20" d:DesignWidth="300">
<TextBox>
    <TextBox.Triggers>
        <EventTrigger RoutedEvent="TextBox.TextChanged">
            <BeginStoryboard>
                <Storyboard AutoReverse="False" BeginTime="0" >
                    <DoubleAnimation Storyboard.TargetName="Foo"
                                 Storyboard.TargetProperty="Opacity"
                                 From="0" To="1" Duration="0:0:1"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </TextBox.Triggers>
    <TextBox.Background>
        <SolidColorBrush Opacity="1" x:Name="Foo" Color="LightGray" />
    </TextBox.Background>
</TextBox>
</UserControl>

なりますので注意してください(なるとどうなるんでしょうか、などが含まれます。そんなわけで、ファンシテキストボックス:)

の構築ソリューション、そして、新しい項目が表示されるツールボックス-ドラッグ&ドロップだけのフォームのコンポーネントのラインナップが開催される内ElementHost要素となります。の美しさであることができないビジュアルスタイルコンポーネントのラインナップしたのが主催するコンポーネントのラインナップに追加し一定の重量をソリューション...

あなた自身のクラスを導き出します TextBox. 。それを与えます Flash() 点滅を開始する方法。変更するだけです BackColor パステル色に。 Alphaを使用しないでください TextBox.

このクラスのすべてのインスタンスが共通のタイマーを共有するようにする必要があるため、同時にフラッシュする必要があります。タイマーを静的にし、参照カウントあなたが持っているインスタンスの数を参照します。コンストラクター、下に合計します Dispose(bool) オーバーライド。

Winformsを使用する方法を設定している場合は、限られた知識を持って、サードパーティのコントロールを手伝うことをお勧めします。名前が付けられるのは、TelerikとComponentoneです。 WinFormsのようなものが必要な場合は、おそらくWPFを利用して、XAMLでカスタムアニメーションを開発できます(UI状態とアニメーションの作成においてSilverlight XAMLに似ていると思います)。これら以外に、私は助けを提供する経験があります。

アプリに応じて、これを行う派手な方法の1つは、テキストボックスのイメージのガンマを変更することです。もちろん、これはあなたがこれにどれだけの時間を入れたいかに依存しますが、それは確かに実行可能です。画像のガンマを調整し、コントロールの画像を取得する方法に関するいくつかのチュートリアルを見てきました。

とはいえ、テキストボックスのバックカラーを透過的に設定することは重要ではないと信じています。あなたの言葉遣いから、私はあなたが基礎となるコントロールのバックカラーからTextBoxのバックカラーに色をフェードさせたいと思うだけであると推測できます。その場合、問題は再び些細なことです。ただし、背景画像がある場合は、おそらく再考する必要があります。それにもかかわらず、それはまだ可能であり、それがあなたが達成しようとしていることであれば、これを行う方法についてあなたのためにリンクを掘り下げることができます。

簡単な解決策は、テキストの色と背面の色を白から現在のフォアグラウンドの色にアニメーション化することです。

スレッドの使用に興味がない場合は、ここでジョージジョンストンの答えに基づいて、私の実装は次のとおりです。

private bool CurrentlyFlashing = false;
private void FlashInternal(TextBox textBox, int interval, Color flashColor, int flashes)
{
    if (CurrentlyFlashing) return;

    CurrentlyFlashing = true;
    Color original = textBox.BackColor;
    for (int i = 0; i < flashes; i++)
    {
        UpdateTextbox(textBox, flashColor);
        Application.DoEvents();
        Thread.Sleep(interval / 2);
        UpdateTextbox(textBox, original);
        Application.DoEvents();
        Thread.Sleep(interval / 2);
    }
    CurrentlyFlashing = false;
}
private delegate void UpdateTextboxDelegate(TextBox textBox, Color originalColor);
public void UpdateTextbox(TextBox textBox, Color color)
{
    if (textBox.InvokeRequired)
    {
        this.Invoke(new UpdateTextboxDelegate(UpdateTextbox), new object[] { textBox, color });
    }
    textBox.BackColor = color;
}

かなり古い質問ですが、最後の回答が答えた2010年にはAsync/待ち望んでいなかったので、私はより現代的な答えで更新すると思いました

また、それを更新して、発作を誘発するオンオフの瞬きではなく、きれいにフェードする単一フラッシュを使用し、テキストボックスで使用することに制限されていないようにタイピングを変更しました。

async/awaitを使用しているため、代表者や InvokeRequired 小切手。フェードの期間を長いものに設定しても、フェードループが実行されている間、アプリケーションと対話することができます。

    private bool CurrentlyFlashing = false;
    private async void FlashControl(Control control)
    {
        Color flashColor = Color.Yellow;

        float duration = 500; // milliseconds
        int steps = 10;
        float interval = duration / steps;

        if (CurrentlyFlashing) return;
        CurrentlyFlashing = true;
        Color original = control.BackColor;

        float interpolant = 0.0f;
        while (interpolant < 1.0f)
        {
            Color c = InterpolateColour(flashColor, original, interpolant);
            control.BackColor = c;
            await Task.Delay((int) interval);
            interpolant += (1.0f / steps);
        }

        control.BackColor = original;

        CurrentlyFlashing = false;
    }

    public static Color InterpolateColour(Color c1, Color c2, float alpha)
    {
        float oneMinusAlpha = 1.0f - alpha;
        float a = oneMinusAlpha * (float)c1.A + alpha * (float)c2.A;
        float r = oneMinusAlpha * (float)c1.R + alpha * (float)c2.R;
        float g = oneMinusAlpha * (float)c1.G + alpha * (float)c2.G;
        float b = oneMinusAlpha * (float)c1.B + alpha * (float)c2.B;
        return Color.FromArgb((int)a, (int)r, (int)g, (int)b);
    }

これを再利用すると、一般的にアプリケーション全体で同じようにしたいので、他の応答者と同じように機能パラメーターとしてそれらを公開するのではなく、色とタイミングをハードコーディングしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top