Как бы я сделал элемент управления, который мигает / исчезает при щелчке мыши? (Windows) - PullRequest
3 голосов
/ 10 ноября 2008

Когда пользователь нажимает в определенных местах в моем элементе управления, я хочу изменить цвет некоторых строк и столбцов в моей сетке, а затем постепенно вернуть его к нормальному цвету, скажем, в пределах 500 мс или около того. Я еще не решил, использовать ли Winforms или WPF, поэтому совет по любой из этих технологий будет работать. Спасибо.

Редактировать: я понимаю, что я мог бы сделать это, просто вызвав Paint в цикле внутри события click, правильно установив параметры рисования. Однако я считаю, что это заблокирует пользовательский интерфейс, и я хотел бы быть более отзывчивым.

Ответы [ 3 ]

2 голосов
/ 10 ноября 2008

WPF имеет очень хорошую поддержку анимации. Анимации поддерживаются как из xaml, так и из кода, так что вы должны иметь возможность добиться любого вида, который вы ищете.

MSDN Обзор анимации для WPF содержит много полезной информации для начала работы.

1 голос
/ 10 ноября 2008

Вот один из способов справиться с замиранием:

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. Если вы можете найти способ обойти это, этот код может помочь.

0 голосов
/ 10 ноября 2008

В самом простом подобном эффекте затухания просто необходим какой-то таймер, который градуирует цвет назад к нормальному с каждым тиком. Чем быстрее время, тем больше дискретных цветов вы будете отображать от начала до конца, и тем плавнее будет общий эффект (для этого в WPF может быть что-то встроенное).

Вы определенно не хотите перекрасить в цикле. Как вы указали, это заблокирует пользовательский интерфейс, а также вы не сможете контролировать, сколько времени занимает цикл (разные машины будут отображать одинаковое количество шагов от выделенного цвета до нормального за разное время).

...