Возможно ли привязать PolyLineSegment . Points через xaml в ControlTemplate?Указывает через xaml в ControlTemplate?

#wpf #xaml #templates #controls

#wpf #xaml #шаблоны #элементы управления

Вопрос:

Недавно мне понадобилось изменить шаблон 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 через xaml в ControlTemplate ?Указывает на ширину и высоту большого пальца.

Но Visual Studio выдает ошибку:

«Объект ошибки типа ‘System.Windows.TemplateBindingExpression’

не может быть преобразован в тип ‘System.Double’.»

Я не знаю, почему это не может работать. Кто-нибудь может дать мне подсказку?

Ответ №1:

Наконец, я нашел, в чем проблема. Я обнаружил, что это потому, что Point.X or Point.Y не является свойством зависимости. Так вот почему привязка не работает.

Я решаю этот вопрос путем привязки к LineSegment .

  <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>