Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting WPF background Opacity programmatically

Tags:

c#

opacity

wpf

I'm working on application which creates a new wpf border component for each row in a database. This means I've got to style the border component in C# rather than XAML (as far as I'm aware). The styling is all good so far apart from trying to set the background opacity.

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);

You can adjust the background opacity in XAML like so

<Border BorderThickness="1" Height="100" Width="100">
    <Border.BorderBrush>
        <SolidColorBrush Color="Black" Opacity="0.7"/>
    </Border.BorderBrush>
</Border>

But as I've said I'm creating the component in C# rather than XAML. I guess this is how you set the value in c#

moboBorder.Background.Opacity = //Value

However, I can't figure out what kind of value it takes, not just a straight up number, nothing from brushes than I can see and nothing like = new Opacity()

I've tried googling around but everything is about setting the opacity for the whole element rather than just the background of it.

like image 993
Jelly Avatar asked Dec 03 '22 21:12

Jelly


2 Answers

A double is certainly a "straight up number"; hover the mouse over the property to see the data type.

The problem (thanks, Clemens) is that you're trying to set the opacity of Brushes.Black, which is a system object and you've got no business doing that.

But you can set the Opacity of a SolidColorBrush that you create yourself.

To create a new semi-opaque white brush:

x.Background = new SolidColorBrush(Colors.White) { Opacity = 0.5 };

See Geoff's answer for how to create a color from an RGB triplet (or ARGB quad) instead of named colors.

Or just keep the existing brush, if you're confident that you didn't get it from Brushes.

Background.Opacity = 0.5;

If you did this, you got it from System.Brushes:

<Window
    Background="DeepSkyBlue"
    ...

If you did this, you didn't:

<Window.Background><SolidColorBrush Color="DeepSkyBlue" /></Window.Background>

That DeepSkyBlue is Colors.DeepSkyBlue; you're creating a new brush with that color.

You should be doing all of this in XAML with bindings instead of creating WPF controls in C#. You'll shoot your eye out, kid.

But it's your eye.

like image 86
15ee8f99-57ff-4f92-890c-b56153 Avatar answered Dec 26 '22 20:12

15ee8f99-57ff-4f92-890c-b56153


The equivalent of the XAML

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

in code behind would be

moboBorder.Background = new SolidColorBrush
{
    Color = Colors.Black,
    Opacity = 0.7
};

In contrast to the predefined Brushes in the Brushes class (which are frozen), the above SolidColorBrush can be changed at any time later, like

moboBorder.Background.Opacity = 0.5;
like image 21
Clemens Avatar answered Dec 26 '22 19:12

Clemens