是否可以通过ControlTemplate中的xaml绑定PolyLineSegment.Points?

时间:2019-03-28 02:03:57

标签: wpf xaml templates controls

最近,我需要更改Thumb的模板。我想像这样将其形状更改为三角形。我使用路径作为其ControlTemplate。这是代码:

 <Thumb
        Width="100"
        Height="30"
        HorizontalAlignment="Left"
        VerticalAlignment="Top">
        <Thumb.Template>
            <ControlTemplate>
                <Path Fill="Red">
                    <Path.Data>
                        <PathGeometry>
                            <PathFigure>
                                <PolyLineSegment>
                                    <PolyLineSegment.Points>
                                        <PointCollection>
                                            <Point X="0" Y="0" />
                                            <Point X="{TemplateBinding Width}" Y="{TemplateBinding Height}" />
                                            <Point X="0" Y="{TemplateBinding Height}" />
                                        </PointCollection>
                                    </PolyLineSegment.Points>
                                </PolyLineSegment>
                            </PathFigure>
                        </PathGeometry>
                    </Path.Data>
                </Path>
            </ControlTemplate>
        </Thumb.Template>
    </Thumb>

您可以看到我尝试将PolyLineSegment.Points绑定到Thumb的Width和Height。

但是Visual Studio抛出错误:

  

“类型为'System.Windows.TemplateBindingExpression'的错误对象

     

不能转换为类型'System.Double'。”

我不知道为什么它不起作用。谁能给我一个提示?

更新

我发现这是因为Point.X或Point.Y不是依赖项属性。这就是为什么绑定不起作用的原因。

我通过绑定到LineSegment来解决此问题。此问题已结束。

1 个答案:

答案 0 :(得分:0)

最后,我找到了问题所在(原因已在更新中),并找到了解决此问题的新方法。

 <ControlTemplate>
                <Path Fill="{TemplateBinding Background}">
                    <Path.Data>
                        <PathGeometry>
                            <PathFigure StartPoint="0 0">
                                <LineSegment>
                                    <LineSegment.Point>
                                        <MultiBinding Converter="{StaticResource thumb2PointConverter}" ConverterParameter="rightBottom">
                                            <Binding Path="Width" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Thumb}" />
                                            <Binding Path="Height" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Thumb}" />
                                        </MultiBinding>
                                    </LineSegment.Point>
                                </LineSegment>

                                <LineSegment>
                                    <LineSegment.Point>
                                        <MultiBinding Converter="{StaticResource thumb2PointConverter}" ConverterParameter="leftBottom">
                                            <Binding Path="Width" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Thumb}" />
                                            <Binding Path="Height" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Thumb}" />
                                        </MultiBinding>
                                    </LineSegment.Point>
                                </LineSegment>
                            </PathFigure>
                        </PathGeometry>
                    </Path.Data>
                </Path>
            </ControlTemplate>