public MainWindow()
{
//Control Template .. We cannot add children to the Control Template Directly
ControlTemplate controlTemplate = new ControlTemplate(typeof(Button));
//These points you can set Dynamically as your requirement
PointCollection points= new PointCollection(new List<Point> { new Point() { X = 0, Y = 0 }, new Point() { X = 0, Y = 50 }, new Point() { X = 100, Y = 200 } });
var polygon = new FrameworkElementFactory(typeof(Polygon));
//You can also set Binding rather than static color for fill
polygon.SetValue(Polygon.PointsProperty, points);
polygon.SetValue(Polygon.FillProperty, new SolidColorBrush(Colors.Pink));
//ContentPresenter
var contentPresenter = new FrameworkElementFactory(typeof(ContentPresenter));
contentPresenter.SetValue(ContentPresenter.ContentProperty,"this is content Presenter");
//Grid
var grid = new FrameworkElementFactory(typeof(Grid));
grid.SetValue(Grid.BackgroundProperty, new SolidColorBrush(Colors.Yellow));
grid.AppendChild(polygon);
grid.AppendChild(contentPresenter);
controlTemplate.VisualTree = grid;
//Style
Style style = new Style(typeof(Button));
style.Setters.Add(new Setter(BackgroundProperty, new SolidColorBrush(Colors.Red)));
style.Setters.Add(new Setter(TemplateProperty, controlTemplate));
this.Resources.Add("SomeKey", style);
//Initialize
InitializeComponent();
}
<Grid>
<Button Style="{DynamicResource SomeKey}"/>
</Grid>
これがあなたのやり方のアイデアを与えるのに役立つことを願っています。はい、ポリゴンの塗りつぶしやContentPresenterのコンテンツなどのコードビハインドですべてのバインディングを設定できます。
注テンプレートの作成にはXamlを使用することをお勧めします。あなたの問題のように、あなたが望むのはダイナミックなポリゴンのポイントだけです。CodeBehindでテンプレート全体を作成するよりも、PolygonのPointsプロパティをバインドする方が適切です。