WPF禁用不透明度级别

本文关键字:不透明度 WPF | 更新日期: 2023-09-27 18:16:16

我需要改变一个容器(网格/dockpanel/等)内的控件的不透明度,当他们被禁用,所以他们看起来更亮,或更少变暗。

当容器被禁用时,嵌套控件的不透明度会降低到0.5左右。如果我尝试在禁用时调整容器的不透明度,无论我将其设置为什么,最大值总是限制为0.5。分配不透明度的方法也不重要,我直接在代码和样式/触发器中尝试过。

我猜这是通过屏蔽矩形(或其他窗口类型)和设置不透明度在容器中实现的。然后,从MSDN它说:

不透明度从父元素应用到元素树子元素,但嵌套不透明度设置的可见效果不会在单个子元素的属性值中显示。例如,如果一个列表的不透明度为50%(0.5),其中一个列表项目有自己的不透明度设置为20%(0.2),净可见不透明度对于该列表项,将呈现为10%(0.1),但是列表项不透明度属性的属性值仍然是0.2当查询。

所以我明白为什么我看到这种行为,我只是希望有一种方法来覆盖它?

如果没有,我能想到的唯一选择是滚动我自己的禁用行为与我自己的矩形,然后我可以设置我需要的不透明度级别。听起来像是不必要的麻烦,除非我错过了什么?

请注意,我对这个问题很感兴趣,但是以这种方式设置代码的不透明度并没有什么不同,禁用的控件似乎不受影响。

WPF禁用不透明度级别

WPF控件的正常禁用状态是通过使用不同的背景和前景笔刷来呈现的,这些笔刷是使用控件模板中的触发器设置的,而不是改变不透明度。例如,对于TextBox,它有这样的触发器:

<ControlTemplate.Triggers>
    <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    </Trigger>
</ControlTemplate.Triggers>

不透明度不变。如果你有一个IsEnabled="False"的GroupBox,那么所有子控件都将继承IsEnabled状态。

如果你想以某种方式改变禁用的外观,然后创建自己的模板样式或修改默认的