1


0

表示後のWindowsフォームの不透明度-C#

私はC#を使用してWindowsフォームをフェードインしようとしていますが、フォームを表示した後は動作しないようです。 Iveを表示した後、フォームの不透明度を変更することはできますか?

コード:

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 Answer


3


マルチスレッドタイマーであるSystem.Timers.Timerを使用しているため、OnTimedEvent()で別のスレッドによって作成された制御を呼び出し、例外が発生します。

System.Windows.Forms.Timerを使用する場合、機能します。 テストしました。


1


あなたのコードを使用して(そして他の必要なフォームクラスを作成します)、タイマーが最初に起動してイベントハンドラーが呼び出されたときにクロススレッド例外が発生します、https://stackoverflow.com/questions/2032966/windows-forms-opacity -after-shown-c / 2032996#2032996 [ベニーが示唆するとおり]。

コードを変更してタイマーイベントハンドラーで「InvokeRequired」を確認し、必要に応じて「Invoke」を使用して「PropForm.Opacity」を変更すると、必要に応じてフォームが表示された後に不透明度が変更されます。

おそらく、「不透明度」を「0」から始めて、徐々に_増やしてください。そうしないと、フォームは完全に堅実に始まり、徐々に消えていきます_out_

Opacityが一部のバージョンのWindowsに影響を与えることはありませんが、他の場所でOpacity効果を使用していると言いますが、この場合はそうではありません。


0


タイマーなしで動作するようになりました:

        int Loop = 0;

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

しかし、この例を変更するのではなく、フェードインではなくフェードインすることはできません。