views:

592

answers:

1

Hi, 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.

+1  A: 

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 http://stackoverflow.com/questions/2481224/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.

itowlson
Yuck. Thanks anyway. :-)
Thomas Stock