4

XAMLに があり、そのプロパティはViewModel ( を実装しています) のプロパティにバインドされています。別のボタンは、次のように実行時間の長い (2 ~ 3 秒) プロセスを起動します。please wait TextBlockVisibilityIsBusyINotifyPropertyChanged

IsBusy = true;

try
{
    // Do some long-running process
}

finally
{
    IsBusy = false;
}

しかし、please waitメッセージは表示されません。操作が UI スレッドで実行されていると想定しているため、更新する機会がありませんか? 上記のコードを別のスレッドで実行すると機能しますが、操作の実行中にユーザーに何もさせたくありません.UIfreeze.

please wait メッセージを表示するにはどうすればよいですか? それとも、バックグラウンド スレッドで実行し、(どういうわけか) その間 UI をロックしたほうがよいでしょうか? 私は.Net 4 btwを使用しています。

4

3 に答える 3

5

同じスレッドでコードを実行しているため、更新されていないため、プロセスが終了するまでレンダリングは続行されません。

操作の実行中にユーザーに何もさせたくないため、バックグラウンド スレッドを使用していないと言いましたが、このようにアプリケーションを完全にロックすることは決して良い考えではありません。

より良い解決策はIsEnabled、フォーム/ウィンドウ/ユーザー コントロールなどをIsBusyプロパティにバインドすることです。その後、ビジー状態になると、フォーム全体が無効になり、ユーザーがフォームを変更できないようになりますが、アプリケーションがロックされることはありません。

于 2013-01-30T16:35:06.097 に答える
1

最初Visibilityはプロパティがそうではないboolので、変数をそれにバインドする場合は、boolを使用する必要がありますIValueConverter。次に、そうです。UIスレッドが長時間実行される操作でビジー状態の間、可視性の変更を含む他の処理は実行されません。

WPF Toolkit BusyIndicator私はあなた自身のパネルを置くことを期待して使うことを提案します、それはIsBusy bool特性を持っています。

また、凍結されたUIはユーザーフレンドリーではなく、通常はこのスニペットを使用します

IsBusy = true;
Task.Factory.StartNew(() => 
{ 
  // Do work. 
})
.ContinueWith(t=>IsBusy=false, 
                        TaskScheduler.FromCurrentSynchronizationContext());

また、メソッドのエラーをチェックすることに注意してください。そうしないと、破棄ContinueWith時に例外が発生します。Task

于 2013-01-30T15:37:31.043 に答える