我刚刚搜索了一种在父控件的IsEnabled=false
的情况下启用子控件的方法。到目前为止,我找到的所有答案都说这是不可能的 - 必须启用父控件并禁用子控件,除非仍应启用某些子控件。
然而,通过覆盖App.xaml.cs文件中的IsEnabledProperty元数据,我能够改变这种默认行为:
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
属性,它将覆盖父级值。
这种方法有什么缺点吗?