4

最終的に表示されるまでに数秒かかるフォームがあります。このフォームは次のように呼び出されます。

using (ResultsForm frm = new ResultsForm())
{
    this.Visible = false;
    frm.ShowDialog();
    this.Visible = true;
}

Cursors.WaitCursorフォームが最終的に表示されるのを待っている間に、デフォルトのカーソルを取得すると便利です。現在、静的な「Current」プロパティを使用することによってのみ、これを正常に実行できるようです。

using (ResultsForm frm = new ResultsForm())
{
    //this.Visible = false;
    Cursor.Current = Cursors.WaitCursor;
    frm.ShowDialog();
    //this.Visible = true;
}

しかし、これには2つの問題があります。

  • 保持したいMainForm非表示機能を無効にする必要があります。
  • Cursor.Current = Cursor.Default;ResultsForm Shownイベント内で呼び出す必要があるため、結合が増加します。

最初のコードスニペットを変更せずに、結合を回避しながら、フォームの読み込み中にカーソルを変更するにはどうすればよいですか?

更新: 質問に回答しました。ビデオプレゼンテーションが削除されたため、ISPの帯域幅の制限を超えません。

4

5 に答える 5

2

保持したいMainForm非表示機能を無効にする必要があります。

問題なく両方を実行できるはずです。

Cursor.Current = Cursor.Default;なので、結合が増加します。ResultsFormShownイベント内で呼び出す必要があります

カーソルロジックを完全にResultsFormダイアログコードに入れてみましたか?Cursor.Current = Cursors.WaitCursor;ResultsFormのコンストラクター内で設定してCursor.Current = Cursor.Default;から、イベント内で設定できるはずですShown

これにより、ロジックが完全にダイアログ内に保持され、メインウィンドウの外に配置されます。次に、メインウィンドウで可視性を切り替えたままにすることもできます。

于 2009-11-30T21:51:57.300 に答える
1

this.Visible = falseを削除する必要があるのはなぜですか?カーソルを設定している間も、それを実行できるはずです。

ResultsFormに親フォームの代わりにカーソルを設定させることは、許容できる解決策でしょうか?常に時間がかかるコードを開始する前にカーソルを設定してから、最後に戻します。

于 2009-11-30T21:51:39.190 に答える
1

このフォームをロードするときに(から表示されているかどうかに関係なく)常に待機カーソルを表示したい場合は、Reedが示唆しているように、フォーム自体でそれを行う必要があります。

ただし、フォームを表示するこの1つの特定のケースでのみカーソルが必要な場合は、イベントハンドラーにラムダ(またはC#2.0を扱っている場合は匿名デリゲート)を使用できます。

using (ResultsForm frm = new ResultsForm())
{
    this.Visible = false;

    var oldCursor = Cursor.Current;
    Action<object, EventArgs> restoreCursor = 
        delegate
        {
            Cursor.Current = oldCursor;
            frm.Shown -= restoreCursor;
        };
    frm.Shown += restoreCursor;

    Cursor.Current  = Cursor.WaitCursor
    frm.ShowDialog();
}
于 2009-11-30T21:58:37.973 に答える
1

カーソルはWaitCursorに変わりますが、それはほんの一瞬しか存続しません。問題は、メインフォームを非表示にすると、メインフォームの背後にあるウィンドウにカーソルが重なることです。またはデスクトップ。表示されたウィンドウは、WindowsからWM_SETCURSORメッセージを受け取り、カーソルを希望の形に変更します。

しかし、あなたのアプローチにはもっと大きな問題があります。ダイアログが閉じた後、アプリのウィンドウが表示されない瞬間があります。Windowsは、フォーカスを与えるために別のウィンドウを見つけることを余儀なくされます。それはアプリのウィンドウではありません。メインフォームが再び表示されるようになると、フォーカスを取得したウィンドウの背後に表示される可能性があります。この動作は少し不安定になる傾向があり、まだ見つけていない可能性があります。

別の方法でウィンドウを非表示にすることで、両方の問題を解決できます。

  this.Opacity = 0.01;
于 2009-11-30T23:00:07.617 に答える
0

メインフォームを2番目のフォームの所有者にして、モーダルにすることができます。

frm.ShowDialog(this);

次に、frmに「Cursor.Current=Cursors.WaitCursor;」を追加します。コンストラクターに「Cursor.Current=Cursor.Default;」を追加します。示されているイベントで。

私はボタンでこれを試しました、そしてそれは働きます。フォームが読み込まれると、待機カーソルが表示され、デフォルトに戻ります。

フォーム1:

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

namespace WaitCursorTwoForms
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
      }

      private void ButtonClick(object sender, EventArgs e)
      {
         using(Form2 form2 = new Form2())
         {
            form2.ShowDialog(this);
         }
      }
   }
}

Form2:

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

namespace WaitCursorTwoForms
{
   public partial class Form2 : Form
   {
      public Form2()
      {
         Cursor.Current = Cursors.WaitCursor;
         InitializeComponent();
         for (int i = 0; i < 10; i++)
         {
            Thread.Sleep(1000);
         }
      }

      private void OnShown(object sender, EventArgs e)
      {         
         Cursor.Current = Cursors.Default;
      }
   }
}
于 2009-11-30T22:01:11.277 に答える