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