Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Disabling all but one child control in a WPF window

I have a bunch of controls on my window. One of them is a refresh button that performs a cumbersome task on a background thread.

When the user clicks the refresh button, I put the cursor in a wait (hourglass) status and disable the whole window -- Me.IsEnabled = False.

I'd like to support cancellation of the refresh action by letting the user click a cancel button, but I can't facilitate this while the whole window is disabled.

Is there a way to do this besides disabling each control (except for the cancel button) one by one and then re-enabling them one by one when the user clicks cancel?

like image 868
Rob Sobers Avatar asked Nov 07 '08 22:11

Rob Sobers


2 Answers

You can put all the controls in one panel (Grid, StackPanel, etc.), and leave the cancel button in another panel. Then set the IsEnabled property of the other panel.

In practice, this will probably introduce more than one additional panel.

For example, if you had a StackPanel of buttons, you can add an additional StackPanel:

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

Then, you would do the following to disable everything but the cancel button:

controlContainer.IsEnabled = false;
like image 83
Abe Heidebrecht Avatar answered Oct 04 '22 02:10

Abe Heidebrecht


I also wanted the user to be able to cancel out of loading. I found a lovely solution.

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

CancelButton.Enabled = true;

This also allows the main window to be selected and moved unlike this.Enabled = false; which completely locks up the window.

like image 27
DJR Avatar answered Oct 04 '22 03:10

DJR