У меня есть DepencencyProperty (логическое значение), которое отлично работает с эллипсами, но не с ArcSegment. Я делаю что-то невозможное? Вот часть xaml. Обе привязки TemplateBindings Origin и LargeArc не работают в геометрии. Но LargeArc DependencyProperty действительно работает в Эллипсе, поэтому мое DependencyProperty, кажется, настроено правильно.
<ControlTemplate TargetType="{x:Type nodes:TestCircle}">
<Canvas Background="AliceBlue">
<Ellipse Height="10" Width="10" Fill="Yellow" Visibility="{TemplateBinding LargeArc, Converter={StaticResource BoolToVisConverter}}"/>
<Path Canvas.Left="0" Canvas.Top="0" Stroke="Black" StrokeThickness="3">
<Path.Data>
<GeometryGroup>
<PathGeometry>
<PathFigure IsClosed="True" StartPoint="{TemplateBinding Origin}">
<LineSegment Point="150,100" />
<ArcSegment Point="140,150" IsLargeArc="{TemplateBinding LargeArc}" Size="50,50" SweepDirection="Clockwise"/>
</PathFigure>
</PathGeometry>
</GeometryGroup>
</Path.Data>
</Path>
</Canvas>
</ControlTemplate>
То, что я пытаюсь построить, представляет собой (своего рода) пользовательский элемент управления в форме круга, где форма пирога определяется DependencyProperties, а фактическая используемая графика находится в шаблоне, поэтому их можно заменить или настроить. Другими словами: я хотел бы, чтобы код программной части был свободен от визуальных эффектов (что, как я полагаю, является хорошим разделением).
РЕШЕНИЕ--------------------------(Мне пока не разрешено отвечать на мои собственные вопросы)
Я нашел ответ сам, и это может быть полезно для других, столкнувшихся с той же проблемой. Вот почему не удалось выполнить привязку TemplateBinding к геометрии:
Привязка TemplateBinding будет работать только при привязке DependencyProperty к другому DependencyProperty.
Следующая статья направила меня на правильный путь: http://blogs.msdn.com/b/liviuc/archive/2009/12/14/wpf-templatebinding-vs-relativesource-templatedparent.aspx
Свойства ArcSegment не являются DependencyProperties. Таким образом, решение вышеуказанной проблемы заключается в замене
<ArcSegment Point="140,150" IsLargeArc="{TemplateBinding LargeArc}"
с участием
<ArcSegment Point="140,150" IsLargeArc="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=LargeArc}"
Колин, твой рабочий пример, когда в геометрии использовалась «обычная» привязка, навел меня на правильный путь. Кстати, вам нравится инфографика и конструкция вашего UserControl в вашем блоге. И, эй, этот краткий совет по фрагментам кода, особенно по этому атрибуту DP и разделению этих DP на файл частичного класса — чистое золото!