2

フォームの下部にグリッドコントロールがあり、ユーザーが表示/非表示にしたい場合は、表示または非表示にできます。したがって、1つの方法は、フォームのAutoSizeを適切に使用し、そのグリッドのVisubleプロパティをtrueまたはfalseに変更することでした...しかし、少しクールにしましょう!ガレージのドアのように、フォームのサイズをもう少しゆっくりと変更したかったのです。そこで、タイマーをフォームにドロップし、タイマーが刻々と過ぎている間、フォームの高さを少しずつ増やし始めました...

したがって、ユーザーがグリッドの表示/非表示を言うと、次のようになります。

    timer1.Enabled = true;
    timer1.Start();

そしてtimer_clickイベントでこのようなもの:

    this.Height = this.Height + 5;
    if(this.Height -10 > ErrorsGrid.Bottom )
        timer1.Stop();

それは一種の作品ですが、それでも完璧ではありません。たとえば、最初は遅れて、1秒ほどでサイズ変更を停止してから、サイズ変更を再開します...では、このアイデアを念頭に置いて、このことをより良く見せるためにどのような変更を行うべきかを提案しますか?

4

1 に答える 1

5

System.Timers.Timer代わりに使用してみてください。利用可能な.netタイマーの違いについて詳しくは、こちらをご覧ください。ただし、問題は次のようになります。

"このタイマークラスによって発生する[System.Windows.Forms.Timer]イベントは、Windowsフォームアプリの残りのコードと同期しています。これは、実行中のアプリケーションコードがこのタイマーのインスタンスによってプリエンプトされることはないことを意味します。クラス..."

これは、System.Timers.Timerでは問題になりません。SynchronizingObject経過したイベントがUIスレッドで実行されるように、必ずそのオブジェクトをフォームに設定してください。

例:

public partial class Form1 : Form
{
    System.Timers.Timer timer = new System.Timers.Timer(100);

    public Form1()
    {
        InitializeComponent();

        timer.AutoReset = true;
        timer.SynchronizingObject = this;
        timer.Elapsed += timer_Elapsed;
    }

    void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        this.Height += 5;

        if (this.Height -10 > ErrorsGrid.Bottom)
            timer.Stop();
    }

    void button1_Click(object sender, EventArgs e)
    {
        timer.Start();
    }
}
于 2012-06-05T23:14:29.917 に答える