Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create ControlTemplate programmatically in WPF

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.

like image 778
Thomas Stock Avatar asked Mar 28 '10 15:03

Thomas Stock


1 Answers

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.

like image 118
itowlson Avatar answered Sep 17 '22 13:09

itowlson