2

私は標準の WPF MainWindow クラスを持っています。私が望むのは、 を使用してメッセージ ボックスを表示System.Windows.MessageBoxし、ユーザーからの応答を取得してから、実行時間の長い操作を実行することです (以下の呼び出しで をシミュレートしますSleep(...))。カーソルをCursors.Wait操作前に設定し、最後に通常に戻したいです。これが私が持っているものです:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ui_button_Click(object sender, RoutedEventArgs e)
    {
        if (MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButton.YesNo) == MessageBoxResult.No)
        {
            return;
        }

        Cursor = Cursors.Wait;

        Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() =>
            {
                System.Threading.Thread.Sleep(1500);

                if (Background != Brushes.Green)
                {
                    Background = Brushes.Green;
                }
                else
                {
                    Background = Brushes.White;
                }
                Cursor = Cursors.Arrow;
            }));
    }
}

これは機能しません。カーソルが待機カーソルとして表示されることはありません。ただし、行をコメントアウトすると、MessageBox機能します。ここで何が起こっているのか、どうすれば意図したとおりに動作させることができますか?

4

4 に答える 4

6

次のコードは私のために働きます:代わりに

Cursor = Cursors.Wait;

これを試して:

Mouse.OverrideCursor = Cursors.Wait;
Mouse.UpdateCursor();

逆の方法で待機カーソルをオフにします。

Mouse.OverrideCursor = null;
Mouse.UpdateCursor();
于 2012-12-18T13:07:49.560 に答える
1

カーソル変更と同じUIスレッドでバックグラウンド変更を実行します。確かにスリープでビジーなので、カーソルの変化は表示されません。(いくつかのスレッドを使用して)あるべき例を作成するだけで、すべてがうまくいきます!

 private void ui_button_Click(object sender, RoutedEventArgs e)
  {
     if (MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButton.YesNo) == MessageBoxResult.No)
     {
        return;
     }

     Cursor = Cursors.Wait;

     BackgroundWorker bw = new BackgroundWorker();
     bw.DoWork += BwOnDoWork;
     bw.RunWorkerCompleted += BwOnRunWorkerCompleted;
     bw.RunWorkerAsync();
  }

  private void BwOnRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs runWorkerCompletedEventArgs)
  {
     if (Background != Brushes.Green)
     {
        Background = Brushes.Green;
     }
     else
     {
        Background = Brushes.White;
     }
     Cursor = Cursors.Arrow;
  }

  private void BwOnDoWork(object sender, DoWorkEventArgs doWorkEventArgs)
  {
     System.Threading.Thread.Sleep(1500);
  }
于 2012-12-18T13:05:14.540 に答える
0

実行したいコードを他のスレッドに入れてみてください

     ThreadPool.QueueUserWorkItem(delegate
     {
       //your code here...
     });
于 2012-12-18T13:09:00.373 に答える
0

試す

DialogResult dialogResult = MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.No)
{
    return;
}

それ以外の

if (MessageBox.Show("Do you want to change the background?", "Change background", MessageBoxButton.YesNo) == MessageBoxResult.No)
于 2012-12-18T12:50:56.153 に答える