Create ControlTemplate programmatically in WPF

Thomas Stock picture Thomas Stock · Mar 28, 2010 · Viewed 17.2k times · Source

How can I programmatically set a button's template?

Polygon buttonPolygon = new Polygon();
buttonPolygon.Points = buttonPointCollection;
buttonPolygon.Stroke = Brushes.Yellow;
buttonPolygon.StrokeThickness = 2;

// create ControlTemplate based on polygon
ControlTemplate template = new ControlTemplate();
template.Childeren.Add(buttonPolygon); // This does not work! What's the right way?

//create button based on controltemplate
Button button = new Button();
button.Template = template;

So I need a way to set my Polygon as the button's template. Suggestions?

Thanks.

Answer

itowlson picture itowlson · Mar 28, 2010

Officially, you should create the XAML for the new ControlTemplate as a string, then materialise it as a ControlTemplate object using XamlReader.Parse.

A more structured way to do this is using the FrameworkElementFactory class -- create a FrameworkElementFactory and set ControlTemplate.VisualTree to that FEF. This gives you improved type safety and avoids the clunkiness of writing out an object tree just to read it in again. However, it is officially deprecated and can get rather complicated if you have a complicated template.

See How to setup a WPF datatemplate in code for a treeview? for examples of both approaches -- they are written in the context of a DataTemplate but will work for a ControlTemplate as well.