C# - Miganie aplikacji podczas animacji

0

Witam,
mam problem z migającą aplikacją podczas animacji przycisku. Chciałem aby po kliknięciu przycisku on znikał w czasie ok ~1s przy użyciu Timer-a. Wszystko działa poprawnie tylko że w czasie animacji cała aplikacja miga.

        
        public Form1()
        {
            InitializeComponent();
            kafelka_1.BackColor = Color.FromArgb(0, 75, 175, 255);
        }
        
        private void opacity_start_Tick(object sender, EventArgs e)
        {           
            kafelka_1.BackColor = Color.FromArgb(opacity, 75,175,255);
            opacity += 10;
            if (opacity > 250)
                opacity_start.Enabled = false;
        }

        private void kafelka_1_Click(object sender, EventArgs e)
        {
            opacity_start.Enabled = true;
        } 
0

Jaki masz interwał tego timer? W ogóle to jest Timer z windows forms? Zrobiłem małe demo u siebie i nie zauważyłem problemu z miganiem, ale wykorzystałem

System.Windows.Threading.DispatcherTimer

Tak w ogóle to masz błąd w kodzie, metoda FromArgb(opacity, 75, 175, 255); będzie ci się sypać bo opacity może być maksymalnie 255, chyba że w jakimś miejscu którego nie pokazałeś zerujesz tą wartość, ale i tak bym to sprawdzał przed wywołaniem metody i ew. zmniejszał do 255.

0

Ustaw DoubleBuffered formy na true. Może coś pomóc.
Ale cudów nie oczekuj, bo to się nie bardzo nadaje do tworzenia wypaśnych graficznie aplikacji.

0

interval: 17
Timer: System.Windows.Forms.Timer
(nie wiem jak zmienić rodzaj timera)

DoubleBuffered próbowałem i nie daje efektu

na razie testowałem tylko działanie 'animacji' dlatego błąd w kodzie

0

Tu masz opis timera, z którego korzystałem: http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatchertimer(v=vs.110).aspx
Tu masz kod z mojego dema, ale nie jestem pewien, że to problem z timerem, może w ogóle coś się dzieje "w tle" twojej aplikacji?:

    public partial class Form1 : Form
    {
        System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
        private int opacity;
        public Form1()
        {
            InitializeComponent();
            timer.Tick += timer_Tick;
            timer.Interval = new TimeSpan(0,0,0,0,17);
            opacity = 0;
            button1.BackColor = Color.FromArgb(0, 75, 175, 255);
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            button1.BackColor = Color.FromArgb(opacity, 75, 175, 255);
            opacity += 10;
            if (opacity > 250)
            {
                timer.Stop();
                opacity = 0;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer.Start();
        }
0

The type or namespace name 'Threading' does not exist in the namespace 'System.Windows' (are you missing an assembly reference?)

0

via link z MSDN, który podałem wyżej:

Namespace: System.Windows.Threading
Assembly: WindowsBase (in WindowsBase.dll)

Do referencji projektu musisz dodać WindowsBase.dll oraz użyć klauzuli

using System.Windows.Threading;
0

niestety dalej miga

0

To bez kodu całej formy niewiele można pomóc. Bo co to znaczy "miga"? Masz tam jedną kontrolkę, dwie, tysiąc?

0

mam tam zwykłego panela. Zauważyłem że problem występuje tylko podczas zmiany przezroczystości, a wszystko inne (ruch, zmiana r,g,b) działa w porządku. Czy jest inny sposób na kontrolowanie przezroczystości niż Color.FromArgb()? (bo w tym tkwi problem)

czy jest taki event który włącza się po załadowaniu się aplikacji (Shown & Load działają za wcześnie)

1 użytkowników online, w tym zalogowanych: 0, gości: 1