WPF中Grid设置Opacity后内部Canvas/Rectangle透明度不生效问题
解决WPF中Grid设置Opacity后子元素无法完全不透明的问题
在WPF中,容器的Opacity属性会作用于整个子元素可视化树,子元素的最终透明度是自身Opacity值和父容器Opacity值的乘积。你给Grid设置了0.5的透明度,就算给Canvas和Rectangle设1,最终透明度还是0.5 * 1 = 0.5,所以没法达到完全不透明的效果。
解决方法
不要直接给Grid设置Opacity,而是将Grid的Background属性改为带透明度的颜色值,这样仅Grid的背景是半透明,子元素不受影响。
修改后的XAML代码
<Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp1" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800" WindowStyle="None" WindowState="Maximized" AllowsTransparency="True" Background="Transparent"> <Grid x:Name="grid" MouseDown="Grid_MouseDown" MouseUp="Grid_MouseUp" MouseMove="Grid_MouseMove" Background="#80000000"> <!-- #80对应0.5透明度,000000为黑色 --> <Canvas> <Rectangle x:Name="selectionBox" Visibility="Collapsed" Stroke="White" StrokeThickness="1"/> </Canvas> </Grid> </Window>
补充说明
- 十六进制颜色值的前两位代表透明度,
#80对应十进制128,正好是0.5的透明度范围(0为完全透明,FF为完全不透明)。 - 子元素默认
Opacity为1,无需额外设置,可以直接移除相关属性。
内容的提问来源于stack exchange,提问作者addzax
相关产品推荐
相关产品推荐

