我有一个 DepencencyProperty(一个布尔值),可以在椭圆上正常工作,但不能在 ArcSegment 上工作。我在做一些不可能的事情吗?这是 xaml 的一部分。Origin和LargeArc的 TemplateBindings在几何中都不起作用。但是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}"
Colin,您在几何中使用“普通”绑定的工作示例使我走上了正确的轨道。顺便说一句,喜欢您的博文中的信息图表和 UserControl 的构造。而且,嘿,关于代码片段的快速提示,尤其是关于 DP 属性以及将这些 DP 分离到部分类文件中的技巧是纯金!