3

ユーザーがコントロール内の特定の場所をクリックすると、グリッド内のいくつかの行と列の色を変更してから、500 ミリ秒程度で通常の色にフェードバックしたいと考えています。Winforms と WPF のどちらを使用するかはまだ決めていないので、これらのテクノロジのいずれかに関するアドバイスが有効です。ありがとうございました。

編集:クリックイベント内のループでペイントを呼び出し、描画パラメーターを適切に設定するだけでこれを実行できることを理解しています。ただし、それは UI をブロックすると考えており、それよりも応答性を高めたいと考えています。

4

3 に答える 3

2

WPF はアニメーションを非常によくサポートしています。アニメーションは xaml とコード ビハインドの両方でサポートされているため、目的の外観を実現できるはずです。

WPFの MSDNアニメーションの概要には、開始するのに役立つ情報がたくさんあるようです。

于 2008-11-10T04:54:54.790 に答える
1

フェードを処理する方法の 1 つを次に示します。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public class FadeForm : Form
    {
        private Timer fadeTimer;
        private Panel fadePanel;
        private Button fadeButton;
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose( bool disposing )
        {
            if ( disposing && ( components != null ) )
            {
                components.Dispose();
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.fadePanel = new System.Windows.Forms.Panel();
            this.fadeButton = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // fadePanel
            // 
            this.fadePanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.fadePanel.Location = new System.Drawing.Point( 4, 8 );
            this.fadePanel.Name = "fadePanel";
            this.fadePanel.Size = new System.Drawing.Size( 276, 104 );
            this.fadePanel.TabIndex = 0;
            // 
            // fadeButton
            // 
            this.fadeButton.Location = new System.Drawing.Point( 104, 116 );
            this.fadeButton.Name = "fadeButton";
            this.fadeButton.Size = new System.Drawing.Size( 75, 23 );
            this.fadeButton.TabIndex = 1;
            this.fadeButton.Text = "Fade";
            this.fadeButton.UseVisualStyleBackColor = true;
            this.fadeButton.Click += new System.EventHandler( this.HandleFadeButtonClick );
            // 
            // FadeForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F );
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size( 284, 142 );
            this.Controls.Add( this.fadeButton );
            this.Controls.Add( this.fadePanel );
            this.Name = "FadeForm";
            this.Text = "Fade Form";
            this.ResumeLayout( false );

        }

        #endregion

        public FadeForm()
        {
            InitializeComponent();

            this.fadeTimer = new Timer();
        }

        private void HandleFadeButtonClick( object sender, EventArgs e )
        {
            this.fadeTimer.Tick += new EventHandler( HandleFadeTimerTick );
            this.fadePanel.BackColor = Color.Red;
            this.fadeTimer.Interval = 100;
            this.fadeTimer.Start();
        }

        void HandleFadeTimerTick( object sender, EventArgs e )
        {
            Color panelColor = this.fadePanel.BackColor;

            if ( panelColor.A > 0 )
            {
                this.fadePanel.BackColor = 
                    Color.FromArgb( 
                        Math.Max( panelColor.A - 20, 0 ), 
                        panelColor.R, panelColor.G, panelColor.B );
            }
            else
            {
                this.fadeTimer.Stop();
            }
        }
    }
}

残念ながら、このアプローチは DataGridView の行では機能しないようです。理由はわかりませんが、色のアルファ成分が 255 でない場合、色はまったく表示されません。それを回避する方法を見つけることができれば、このコードが役立つかもしれません。

于 2008-11-10T06:28:43.697 に答える
0

最も単純に言えば、このようなフェード効果には、ティックごとに色を通常の方向にグラデーションさせる何らかのタイマーが必要なだけです。時間が速いほど、最初から最後まで表示される個別の色が多くなり、全体的な効果がより滑らかになります (WPF には、これを行うための組み込み機能がある場合があります)。

ループで再描画したくないことは間違いありません。あなたが指摘したように、これはUIをブロックし、ループにかかる時間を制御することもできません(異なるマシンは異なる時間でハイライトカラーから通常まで同じ数のステップをレンダリングします)。

于 2008-11-10T04:44:51.490 に答える