Anulación de WPF IsEnabled de padre
Acabo de buscar una manera de habilitar un control secundario mientras el control primario tieneIsEnabled = false
. Todas las respuestas que he encontrado hasta ahora dicen que no es posible: uno tiene que habilitar el padre y deshabilitar los controles secundarios, excepto los que aún deberían estar habilitados.
Sin embargo, al anular los metadatos para IsEnabledProperty en el archivo App.xaml.cs, pude cambiar este comportamiento predeterminado:
protected override void OnStartup(StartupEventArgs e)
{
UIElement.IsEnabledProperty.OverrideMetadata(typeof(FrameworkElement),
new UIPropertyMetadata(true,IsEnabledChanged, CoerceIsEnabled));
}
private void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var childrenCount = VisualTreeHelper.GetChildrenCount(d);
for (int i = 0; i < childrenCount; ++i)
{
var child = VisualTreeHelper.GetChild(d, i);
child.CoerceValue(UIElement.IsEnabledProperty);
}
}
private object CoerceIsEnabled(DependencyObject d, object basevalue)
{
var parent = VisualTreeHelper.GetParent(d) as FrameworkElement;
if (parent != null && parent.IsEnabled == false)
{
if (d.ReadLocalValue(UIElement.IsEnabledProperty) == DependencyProperty.UnsetValue)
{
return false;
}
}
return basevalue;
}
Ahora puede configurar manualmente elIsEnabled
propiedad de un elemento secundario, que anula el valor principal.
¿Hay algún inconveniente de este enfoque?