1

xaml タグの静的ポイントではなく、ポリゴンの動的ポイントを生成するには、C# コードを使用してこのスタイルを作成する必要があります。

 <Style  x:Key="Mystyle" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <Grid  >

                            <Polygon  Points="0,0 0,100 50,200" Fill="{TemplateBinding Background}"
                         Stroke="{TemplateBinding BorderBrush}" DataContext="{Binding}" />
                        <ContentPresenter HorizontalAlignment="Center"
                                      VerticalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
4

2 に答える 2

4
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プロパティをバインドする方が適切です。

于 2012-07-22T06:44:49.913 に答える
0

コードでスタイルを作成する代わりにproperty in your class and bind your points dependency property with that property、ポイントを xaml で事前に定義したくない場合に使用することをお勧めします。そこでBinding便利なのが.

于 2012-07-22T05:44:18.583 に答える