WPF带图标按钮IsEnabled设置后图标无禁用效果问题求助
带图标按钮的禁用状态异常问题及解决办法
我制作了一个“带图标按钮”:结构为Button内部嵌套DockPanel,其中包含两个TextBlock——一个使用FontAwesome字体作为图标,另一个用于显示按钮文本。
问题:在VS设计器中设置IsEnabled=false时,只有显示文本的TextBlock会呈现禁用状态,图标TextBlock仍保持原始颜色,没有禁用的视觉效果,这是为什么?
由于C#中只能重写被允许的成员,我尝试创建了一个新的IsEnabled属性:
public new bool IsEnabled { get => base.IsEnabled; set { base.IsEnabled = value; txtIcon.Opacity = (value ? 1.0 : 0.4); } }
但问题依旧:在XAML中设置IsEnabled=false时,图标仍不会呈现禁用状态;只有在代码中设置btnOK.IsEnabled=false时,整个按钮才会显示正确的禁用外观。
我完全无法理解这种怪异行为——即便我强制为图标添加了“禁用外观”,VS设计器里的表现还是异常,难道设计器使用的是另一个IsEnabled属性?有没有无需重写IsEnabled的解决办法?
解决方案
原因在于:如果为TextBlock设置了Foreground属性,WPF会检测到这个手动设置,不会自动使其呈现禁用状态。因此必须手动修改TextBlock的外观,最佳方法是在父Button禁用时,将图标TextBlock的Opacity属性设置为0.3左右:
var b = new Binding { // ElementName = "btnOK", Source = btnOK, Path = new PropertyPath("IsEnabled"), }; b.Converter = new OpacityConv();// 将bool值转换为1.0(启用)或0.3(禁用) txtIcon.SetBinding(TextBlock.OpacityProperty, b);
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

