我需要在禁用容器(grid / dockpanel / etc)时更改控件的不透明度,因此它们会显得更亮或更暗。
当容器被禁用时,嵌套控件似乎减少到约0.5(比如)不透明度。如果我在禁用时尝试调整容器的不透明度,则无论我将其设置为什么,最大值始终限制为0.5。分配不透明度的方法也不重要,我已直接尝试使用代码和样式/触发器。
我猜这是通过使用矩形(或其他窗口类型)进行遮罩并设置不透明度来在容器中实现的。然后,from MSDN it says:
不透明度从元素树下的父元素应用到 子元素,但嵌套不透明度设置的可见效果 没有在各个子元素的属性值中指出。 例如,如果列表具有50%(0.5)不透明度和其列表之一 items具有自己的不透明度设置为20%(0.2),净可见不透明度 该列表项目将被渲染为好像它是10%(0.1),但是 列表项的属性值Opacity属性仍为0.2 在查询时。
所以我理解为什么我会看到这种行为,我只是希望有办法覆盖它?
如果没有,我能想到的唯一选择是使用我自己的矩形滚动自己的禁用行为,然后我可以设置我需要的不透明度级别。听起来像是不必要的麻烦,除非我错过了什么?
请注意,我是interested in this question,但是以这种方式设置代码的不透明度并没有做任何不同的事情,禁用的控件似乎不受影响。
答案 0 :(得分:0)
WPF控件中的正常禁用状态是通过使用不同的Background和Foreground画笔呈现的,这些画笔是使用控件模板中的触发器设置的,而不是更改不透明度。例如。对于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>
不透明度不变。如果你有一个GroupBox,其中IsEnabled =&#34; False&#34;然后所有子控件都将继承IsEnabled状态。
如果您想以某种方式更改已禁用的外观,请创建自己的模板样式或修改默认样式。