17

ウィンドウにたくさんのコントロールがあります。それらの 1 つは、バックグラウンド スレッドで面倒なタスクを実行する更新ボタンです。

ユーザーが更新ボタンをクリックすると、カーソルを待機 (砂時計) 状態にして、ウィンドウ全体を無効にします -- Me.IsEnabled = False.

ユーザーがキャンセル ボタンをクリックできるようにすることで、更新アクションのキャンセルをサポートしたいのですが、ウィンドウ全体が無効になっている間はこれを容易にすることはできません。

各コントロール (キャンセル ボタンを除く) を 1 つずつ無効にしてから、ユーザーがキャンセルをクリックしたときに 1 つずつ再度有効にする以外に、これを行う方法はありますか?

4

3 に答える 3

22

すべてのコントロールを 1 つのパネル (Grid、StackPanel など) に配置し、キャンセル ボタンを別のパネルに残すことができます。次に、他のパネルの IsEnabled プロパティを設定します。

実際には、これによりおそらく複数の追加パネルが導入されます。

たとえば、ボタンの StackPanel がある場合、追加の StackPanel を追加できます。

<StackPanel Orientation="Horizontal">
    <StackPanel x:Name="controlContainer" Orientation="Horizontal">
        <!-- Other Buttons Here -->
    </StackPanel>
    <Button Content="Cancel" />
</StackPanel>

次に、キャンセル ボタン以外のすべてを無効にするには、次のようにします。

controlContainer.IsEnabled = false;
于 2008-11-07T22:33:48.680 に答える
5

また、ユーザーがロードをキャンセルできるようにしたかったのです。素敵な解決策を見つけました。

foreach (Control ctrl in this.Controls)
    ctrl.Enabled = false;

CancelButton.Enabled = true;

this.Enabled = false; これにより、ウィンドウを完全にロックするのとは異なり、メイン ウィンドウを選択して移動することもできます。

于 2011-02-07T22:00:59.477 に答える
3

各コントロールの IsEnabled プロパティを、アプリケーションがロックダウンされていることを通知するカスタムのブール値の依存関係プロパティにデータ バインドできます。キャンセルボタンをバインドしないでください。

Donnelleが述べたように、コンバーターでマルチバインディングをセットアップできます。参照できるいくつかの例を次に示します。 コンバーターを使用した WPF MultiBinding パラメータ化された MultiBinding の実装 サンプル

于 2008-11-07T22:30:33.477 に答える