Is there a "Pens" class to complement "Brushes" and "Colors" in WPF?

2.9k Views Asked by At

There isn't one called Pens, that's for sure, but it's too odd not to find it. Is it really absent, or am I being blind?

(I'm just looking for a convenience class - for example, Colors.Red and Brushes.Red is there, but for pens the shortest appears to be new Pen(Brushes.Red, 1))

2

There are 2 best solutions below

0
On BEST ANSWER

There is not the associated Pens class because a Pen is identified by both a Brush and a Thickness rather than just one property.

If you have a need for a set of standard pens (based on some thickness) then you will have to create your own. Another approach would be to create a code generator to supply the appropriate pens.

Here is an example of a class which adds a Pen for each default Brush:

public class DefaultPens
{
    private Dictionary<Brush, Pen> pens;

    public double Thickness
    {
        get;
        private set;
    }

    // used like defaultPens[Brushes.Red]
    public Pen this[Brush brush]
    {
        get { return this.pens[brush]; }
    }

    public DefaultPens(double thickness)
    {
        this.pens = typeof(Brushes).GetProperties(BindingFlags.Static)
                                   .Where(pi => pi.PropertyType == typeof(Brush))
                                   .Select(pi => pi.GetValue(null, null))
                                   .ToDictionary(
                                       b => b,
                                       b => new Pen(b, thickness));
        this.Thickness = thickness;
    }
}
1
On

There is no Pens class since it would be redundant. (Although you're right: Colors and Brushes are somewhat redundant, too.)

Why? Well, just think about waht a pen is: its properties can be described by a stroke with (or: thickness) and a color (or: brush). Therefore, there is a Pen Constructor(Brush, double).