#1,198 – Selectively Enabling Child Elements in a Disabled Panel
December 15, 2016 Leave a comment
When you set IsEnabled to false in a panel, all child elements in that panel are disabled. You cannot selectively enabled child elements in the panel.
You may, however, want to selectively enable child elements in a panel. (E.g. Disable entire panel, then set IsEnabled=True, IsReadOnly=True on TextBox controls so that you can copy text).
One possible solution is to define a new control that inherits from TextBox and does not coerce the value of IsEnabled.
public class CanEnableTextBox : TextBox { static CanEnableTextBox() { CanEnableTextBox.IsEnabledProperty.OverrideMetadata(typeof(CanEnableTextBox), new System.Windows.UIPropertyMetadata(true, new PropertyChangedCallback(IsEnabledPropertyChanged), new CoerceValueCallback(CoerceIsEnabled))); } private static void IsEnabledPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs args) { // Overriding PropertyChanged results in merged metadata, which is what we want-- // the PropertyChanged logic in UIElement.IsEnabled will still get invoked. } private static object CoerceIsEnabled(DependencyObject source, object value) { return value; } }
You can now use this control in a panel that has IsEnabled set to false and you’ll be able to set IsEnabled on the child TextBox.