以编程方式设置WPF背景不透明度

4

我正在开发一个应用程序,为数据库中的每一行创建一个新的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”吗? - Geoff James
@GeoffJames 我也是这么想的,但是它显示是只读的:https://i.imgur.com/VEkaW9I.png - Jelly
2
@nomicron 一旦画刷被使用,就无法设置其不透明度属性。但是你可以创建一个新的画刷:Background = new SolidColorBrush(((SolidColorBrush)Background).Color) { Opacity = 0.5 }; - 15ee8f99-57ff-4f92-890c-b56153
所以你无法设置它,因为它是“只读”的。那是因为你试图设置BrushOpacity属性。你需要使用一个带有你想要的OpacityBrush来设置Background本身。 - Geoff James
请注意,错误的说法是“一旦画笔在使用中,就无法设置不透明度属性”。只要画笔没有被冻结,您完全可以这样做。Brushes类的成员已经被冻结,因此无论它们是否正在使用,都无法更改。对于任何未来的读者(和潜在的评论点赞者),请注意这一点。 - Clemens
3个回答

10

double肯定是一个“纯数字”;将鼠标悬停在属性上可查看数据类型。

问题在于(感谢Clemens),您试图设置Brushes.Black的不透明度,这是系统对象,您没有做这样的事情的业务。

但是,您可以设置自己创建的SolidColorBrushOpacity

要创建一个新的半透明白色画刷:

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>

深天蓝色是Colors.DeepSkyBlue;你正在用那个颜色创建一个新的画刷。

你应该在XAML中使用绑定来完成所有这些,而不是在C#中创建WPF控件。孩子,你会伤到自己的眼睛。

但那是你的眼睛。


1
完全同意您使用绑定的建议。MVVM无所不能 :o) - Geoff James
1
“你不能在使用中设置画刷的不透明度”这种说法是不正确的。你只是无法更改Brushes类成员的不透明度(因为它们是只读的)。但是,如果你将Background = new SolidColorBrush(Colors.Black)分配给一个元素,稍后可以轻松地设置Background.Opacity = 0.5。两个答案都应该被编辑。 - Clemens
所以最终不需要创建和分配一个新的SolidColorBrush,只需设置其Opacity。请参见我的答案。 - Clemens
@Clemens - 晚了,我可能会很愚蠢,但你的评论难道不与你自己的答案相矛盾吗(关于分配新的SolidColorBrush)? - Geoff James
2
@Clemens - 我可能断章取义并有点主观,抱歉。我经常看到SO的成员在其他人的答案上胡乱评论“看看我的答案”,这种行为太过频繁了。我同意指出这些问题非常有建设性和有价值。现在我已经删除了我的愚蠢评论,以免分散回答的重点。 - Geoff James
显示剩余3条评论

4

XAML的等效物

<Border.BorderBrush>
    <SolidColorBrush Color="Black" Opacity="0.7"/>
</Border.BorderBrush>

在代码后端将是:
moboBorder.Background = new SolidColorBrush
{
    Color = Colors.Black,
    Opacity = 0.7
};

Brushes 类中的预定义画刷(这些画刷是 冻结的)相比,上述 SolidColorBrush 可以在任何时候后更改,例如

moboBorder.Background.Opacity = 0.5;

2

正如@Clemens在评论中友情指出的:

您无法直接设置系统共享画刷的Opacity

您需要使用非共享的SolidColorBrush,然后就可以设置该SolidColorBrushOpacity

从代码的任何位置开始,您都可以更改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.01.0之间的双精度数即可。


希望这可以帮到你。


1
“你不能在使用中设置画刷的不透明度”这种说法是不正确的。你只是无法更改Brushes类成员的不透明度(因为它们是只读的)。但是,如果你将Background = new SolidColorBrush(Colors.Black)分配给一个元素,稍后可以轻松地设置Background.Opacity = 0.5。两个答案都应该被编辑。 - Clemens
好观点,@Clemens - 完全正确!我更新了我的答案以澄清与共享画笔有关的问题。谢谢! - Geoff James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接