Непрозрачность Windows Forms после показа - C # - PullRequest
1 голос
/ 09 января 2010

Я пытаюсь добавить форму окна с помощью c #, но она не работает после того, как я показал форму. Можно ли изменить прозрачность формы после того, как я ее показал?

Код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Timers;

namespace ToolStrip
{
    public partial class Form1 : Form
    {
        Form ToolForm = new ToolForm();
        Form PropForm = new PropertyGrid();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ToolForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            ToolForm.Owner = this;
            ToolForm.Show();
            ToolForm.Location = new Point(50, 50);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            PropForm.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            PropForm.Owner = this;
            PropForm.Show();
            PropForm.Location = new Point(50, 50);

            System.Timers.Timer aTimer = new System.Timers.Timer(10000);

            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 2000;
            aTimer.Enabled = true;

            Console.WriteLine("Press the Enter key to exit the program.");
            Console.ReadLine();
        }

        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            PropForm.Opacity = PropForm.Opacity - 0.25;
            Console.WriteLine(PropForm.Opacity);
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 09 января 2010

, поскольку вы используете System.Timers.Timer, который является многопоточным таймером, в OnTimedEvent () он вызывает элемент управления, созданный другим потоком, что вызывает исключение.

Если вы используете System.Windows.Forms.Timer, он будет работать. я проверял.

1 голос
/ 09 января 2010

Используя ваш код (и создавая другие необходимые классы Form), я получаю исключение межпоточности при первом срабатывании таймера и вызове обработчика события , как предлагает Бенни .

Внесение изменений в код для проверки InvokeRequired в обработчике событий таймера и использования Invoke, если необходимо изменить PropForm.Opacity, приводит к изменению непрозрачности после отображения формы, как требуется.

Обратите внимание, что вы, вероятно, захотите начать с Opacity из 0, и постепенно увеличивать - иначе ваша форма начнёт становиться полностью твердой и постепенно исчезнет из

Попутно упомяну, что непрозрачность не будет влиять на некоторые версии Windows, хотя вы говорите, что у вас есть эффекты непрозрачности, работающие в других местах, так что в этом случае этого не должно быть.

0 голосов
/ 09 января 2010

Я заставил его работать без таймеров:

        int Loop = 0;

        for (Loop = 100; Loop >= 5; Loop -= 10)
        {
            this.PropForm.Opacity = Loop / 95.0;
            this.PropForm .Refresh();
            System.Threading.Thread.Sleep(100);
        }

но, похоже, я не могу изменить этот пример на постепенное увеличение вместо выхода.

...