Я просто искал способ включить дочерний элемент управления, в то время как родительский элемент управления имеет IsEnabled = false
.
Все ответы, которые я нашел до сих пор, говорят, что это невозможно - нужно включить родителя и отключить дочерние элементы управления, кроме тех, которые все еще должны быть включены.
Однако, переопределив метаданные для IsEnabledProperty в файле App.xaml.cs, я смог изменить это поведение по умолчанию:
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;
}
Теперь вы можете вручную установить свойство IsEnabled
для дочернего элемента, которое переопределяет родительское значение.
Есть ли недостатки такого подхода?