Occasionally a question comes up in the MSDN Forum for WPF programming about rendering variable-width lines.
Variable-width lines are not really lines, but actually paths that describe the contour of the line. The frame around this portrait was designed using this technique:
The source code is here to run or download:
If you're interested in rendering interesting variations of lines, be on the lookout for my WPF column in the April 2008 issue of MSDN Magazine.
Another technique (particularly suited for generating variable-width lines in code and when the variation is more subtle) makes use of the stylus and ink API in the System.Windows.Ink and System.Windows.Input namespaces. You create a Stroke object with the StylusPoints property set to a StylusPointCollection object containing a collection of StylusPoint objects. You're basically defining the line as a polyline but each StylusPoint object has a PressureFactor property as well as X and Y properties. Set PressureFactor to a value between 0 and 1 to set the stroke width at that point.
Call the GetGeometry method of Stroke to convert the stroke into a Geometry object, which you can then set to the Data property of a Path object.