C# wpf禁用不透明度级别

C# wpf禁用不透明度级别,c#,wpf,wpf-controls,opacity,C#,Wpf,Wpf Controls,Opacity,我需要在禁用控件(grid/dockpanel/etc)时更改容器中控件的不透明度,使其看起来更亮或更暗 禁用容器时,嵌套控件的不透明度似乎降低到0.5左右。如果我尝试在禁用时调整容器的不透明度,则无论我将其设置为什么,最大值始终限制为0.5。分配不透明度的方法也不重要,我已经直接在代码和样式/触发器中进行了尝试 我猜这是通过使用矩形(或其他窗口类型)遮罩并设置不透明度在容器中实现的。然后,: 不透明度从元素树上的父元素应用到 子元素,但嵌套不透明度设置的可见效果 未在单个子元素的属性值中指示。

我需要在禁用控件(grid/dockpanel/etc)时更改容器中控件的不透明度,使其看起来更亮或更暗

禁用容器时,嵌套控件的不透明度似乎降低到0.5左右。如果我尝试在禁用时调整容器的不透明度,则无论我将其设置为什么,最大值始终限制为0.5。分配不透明度的方法也不重要,我已经直接在代码和样式/触发器中进行了尝试

我猜这是通过使用矩形(或其他窗口类型)遮罩并设置不透明度在容器中实现的。然后,:

不透明度从元素树上的父元素应用到 子元素,但嵌套不透明度设置的可见效果 未在单个子元素的属性值中指示。 例如,如果一个列表的不透明度为50%(0.5),并且其中一个列表 项目本身的不透明度设置为20%(0.2),即净可见不透明度 对于该列表项,将其呈现为10%(0.1),但 列表项不透明度属性的属性值仍然为0.2 当被询问时

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

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


请注意,我是,但以这种方式设置代码的不透明度没有任何不同,禁用的控件看起来不受影响。

WPF控件中的正常禁用状态是使用不同的背景和前景笔刷渲染的,这些笔刷是使用控件模板中的触发器设置的,而不是更改不透明度。例如,对于文本框,它具有以下触发器:

<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状态


如果您想以某种方式更改禁用的外观,请创建自己的模板样式或修改默认样式。

问得很好:)@vnikhil真的吗?对我来说这有点冗长。仅引用MSDN中的文本和多一点解释就足够了。它不需要如此冗长和冗长。事实上,我刚刚通过阅读引文和问题标题理解了这个问题。另一方面,关于这个问题的冗长的评论,但实际上并没有解决它,是可以的。现在我希望我有一个有用的答案。谢谢你的回答,但我并不是说控件本身的不透明度被改变了。相反,我相信它是通过一个覆盖窗口在内部实现的,该窗口“屏蔽”了它下面的所有内容。因此,可以降低容器中禁用控件的不透明度,但不能增加。此外,我不相信你是正确的,禁用的控件没有改变它们的背景和前景。如果是,尝试使用触发器或在代码中设置前景应覆盖“禁用”值,但不会发生这种情况,并且会忽略这些值。