以编程方式设置 WPF 背景不透明度
Posted
技术标签:
【中文标题】以编程方式设置 WPF 背景不透明度【英文标题】:Setting WPF background Opacity programmatically 【发布时间】:2018-05-18 09:47:44 【问题描述】:我正在开发为数据库中的每一行创建一个新的 wpf 边框组件的应用程序。这意味着我必须在 C# 而不是 XAML 中设置边框组件的样式(据我所知)。除了尝试设置背景不透明度之外,样式都很好。
motherboards.Add(new Border());
Border moboBorder = motherboards[i];
moboBorder.Width = 150;
moboBorder.Height = 150;
moboBorder.BorderBrush = Brushes.Black;
moboBorder.Background = Brushes.White;
moboBorder.CornerRadius = new CornerRadius(10);
moboBorder.Margin = new Thickness(5);
moboBorder.BorderThickness = new Thickness(1);
您可以像这样在 XAML 中调整背景不透明度
<Border BorderThickness="1" Height="100" Width="100">
<Border.BorderBrush>
<SolidColorBrush Color="Black" Opacity="0.7"/>
</Border.BorderBrush>
</Border>
但正如我所说,我是在 C# 而不是 XAML 中创建组件。我想这就是你在 c# 中设置值的方式
moboBorder.Background.Opacity = //Value
但是,我无法弄清楚它需要什么样的值,而不仅仅是一个直接的数字,没有什么比我能看到的刷子和 = new Opacity() 之类的东西
我试过用谷歌搜索,但一切都是为了设置整个元素的不透明度,而不仅仅是它的背景。
【问题讨论】:
在0.0
和1.0
之间不是需要double
吗?
@GeoffJames 这就是我的想法,但没有说它是只读的:i.imgur.com/VEkaW9I.png
@nomicron 您无法在画笔上设置 opacity 属性。你可以创建一个新的画笔:Background = new SolidColorBrush(((SolidColorBrush)Background).Color) Opacity = 0.5 ;
所以你不能设置它,因为它是readonly
。那是因为您正在尝试将 Brush. You need to set the
Background 的 Opacity
设置为 Brush
和您想要的 Opacity
对于任何未来的读者(和潜在的评论支持者),请注意说您“一旦使用画笔就不能在画笔上设置不透明度属性”是错误的。你可以很好地做到这一点,只要画笔没有被冻结。 Brushes 类的成员被冻结,因此无法更改(无论它们是否正在使用)。
【参考方案1】:
double
肯定是一个“直号”;将鼠标悬停在属性上以查看数据类型。
问题(感谢 Clemens)是您试图设置 Brushes.Black
的不透明度,这是一个系统对象,而您没有这样做的业务。
但您可以设置您自己创建的SolidColorBrush
的Opacity
。
要创建一个新的半透明白色画笔:
x.Background = new SolidColorBrush(Colors.White) Opacity = 0.5 ;
请参阅 Geoff 的回答,了解如何从 RGB 三元组(或 ARGB 四元组)而不是命名颜色创建颜色。
或者只保留现有的画笔,如果你确信你没有从Brushes
那里得到它。
Background.Opacity = 0.5;
如果你这样做了,你从System.Brushes
得到它:
<Window
Background="DeepSkyBlue"
...
如果你这样做了,你就没有:
<Window.Background><SolidColorBrush Color="DeepSkyBlue" /></Window.Background>
DeepSkyBlue 是Colors.DeepSkyBlue
;您正在使用该颜色创建一个新画笔。
您应该在 XAML 中使用绑定完成所有这些操作,而不是在 C# 中创建 WPF 控件。孩子,你会把你的眼睛射出来的。
但这是你的眼睛。
【讨论】:
完全同意您使用绑定的建议。 MVVM 一路 :o) “画笔一旦使用就不能设置不透明度”的说法是不正确的。您只是无法更改 Brushes 类成员的不透明度(因为它们是只读的)。但是,如果您将Background = new SolidColorBrush(Colors.Black)
分配给一个元素,您以后可以轻松地设置Background.Opacity = 0.5
。两个答案都应该被编辑。
所以最后不需要创建和分配一个new SolidColorBrush,只需要设置它的不透明度。看我的回答。
@Clemens - 已经很晚了,我可能真的很愚蠢,但是您的评论与您自己的答案(关于分配新的 SolidColorBrush)不是矛盾吗?
@Clemens - 我可能把你的评论断章取意,有点主观,抱歉。我经常看到 SO 的成员对“查看我的答案”cmets 的所有答案进行了拖钓。我同意这是非常有建设性的,并增加了指出这些事情的价值。我现在已经删除了我的愚蠢评论,以免偏离答案的重点。【参考方案2】:
XAML 的等效项
<Border.BorderBrush>
<SolidColorBrush Color="Black" Opacity="0.7"/>
</Border.BorderBrush>
后面的代码是
moboBorder.Background = new SolidColorBrush
Color = Colors.Black,
Opacity = 0.7
;
相对于Brushes
类中预定义的Brushes(即frozen),上面的SolidColorBrush可以在以后的任何时候改变,比如
moboBorder.Background.Opacity = 0.5;
【讨论】:
【参考方案3】:正如@Clemens 在 cmets 中指出的那样:
不能直接设置系统共享画笔的Opacity
。
您将需要使用非共享SolidColorBrush
,然后您将能够设置Opacity
。
您将能够从代码中的任何位置更改Opacity
。
例如:
moboBorder.Background = new SolidColorBrush(Color.FromRgb(255, 0, 0))
Opacity = 0.5 // or whatever opacity between
// 0.0 (0%) and 1.0 (100%)
;
或者
moboBorder.Background = new SolidColorBrush(Color.FromRgb(255, 0, 0));
moboBorder.Background.Opacity = 0.5;
与上面的示例类似,如果您使用 RGB,也可以设置 alpha(不透明度)。
您可以改用Color.FromArgb()
静态方法:
moboBorder.Background = new SolidColorBrush(Color.FromArgb(0.5, 255, 0, 0));
只需在 0.0
和 1.0
之间使用双精度(如前所述),作为该方法的第一个参数。
希望这会有所帮助。
【讨论】:
“画笔一旦使用就不能设置不透明度”的说法是不正确的。您只是无法更改 Brushes 类成员的不透明度(因为它们是只读的)。但是,如果您将Background = new SolidColorBrush(Colors.Black)
分配给一个元素,您以后可以轻松地设置Background.Opacity = 0.5
。两个答案都应该被编辑。
好点,@Clemens - 绝对正确!更新了我的答案以澄清这与共享画笔有关。谢谢!以上是关于以编程方式设置 WPF 背景不透明度的主要内容,如果未能解决你的问题,请参考以下文章
设置 WPF 标签内容 Alpha 透明度而不是整个控件的不透明度