假设我有一些已被禁用的控件。它包含一堆元素,但我希望其中一个子元素保持启用状态。
这样的事情:
<ContentControl IsEnabled="False">
<Border>
<Button Content="Button" IsEnabled="True"/>
</Border>
</ContentControl>
因此,在此示例中,Button的IsEnabled =“True”设置被其父级覆盖。有没有办法阻止这种情况发生?
这似乎是一件奇怪的事情,但我有一种情况,当一个Control被禁用而一个用户把它放在上面时,我仍然希望触发一个事件。
我在WPF Unleashed中读到,在Frame控件中包装某些东西,“..从其他UI [和]属性中分离内容,这些属性通常会在到达Frame时从元素树中继承”,但是将上面示例中的Button包装在Frame中不起作用。
我在这里走错了路吗?
答案 0 :(得分:4)
这不是继承,它的构成
禁用包含控件,因此禁用所有包含的控件
启用所需的容器和控件,并禁用其他控件
答案 1 :(得分:4)
如果你可以继承按钮(或你需要的任何控件),你可以替换CoerceValue以避免这种行为(事实上,我认为IsEnabled应该像IsChecked一样工作,是一个bool ?,其中null表示使用父级值,应该保留任何特定值......但由于这不是行为,使用此解决方案将解决问题):
public sealed class InheritedButton:
Button
{
static InheritedButton()
{
InheritedButton.IsEnabledProperty.OverrideMetadata
(
typeof(InheritedButton),
new FrameworkPropertyMetadata
(
true,
null,
_CoerceIsEnabled
)
);
}
private static object _CoerceIsEnabled(DependencyObject source, object value)
{
return value;
}
}