1

我有一个 DepencencyProperty(一个布尔值),可以在椭圆上正常工作,但不能在 ArcSegment 上工作。我在做一些不可能的事情吗?这是 xaml 的一部分。OriginLargeArc的 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 分离到部分类文件中的技巧是纯金!

4

1 回答 1

0

应该行得通。虽然我看不到一个直接的问题,但我只是想指出我写了一篇文章,其中包括一个饼形的 Silverlight 实现:

使用 Silverlight 绘制循环关系图

此形状的 XAML 如下所示:

<Style TargetType="local:NodeSegment">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="local:NodeSegment"> 
          <Path Stroke="{TemplateBinding Stroke}"
                StrokeThickness="{TemplateBinding StrokeThickness}"
                Fill="{TemplateBinding Background}"
                DataContext="{Binding ViewModel}"
                x:Name="segmentShape">
            <Path.Data>
              <PathGeometry>
                <PathFigure StartPoint="{Binding Path=S1}"
                            IsClosed="True">
                  <ArcSegment Point="{Binding Path=S2}"
                              SweepDirection="Counterclockwise"
                              IsLargeArc="{Binding Path=IsLargeArc}"
                              Size="{Binding Path=OuterSize}"/>
                  <LineSegment Point="{Binding Path=S3}"/>
                  <ArcSegment Point="{Binding Path=S4}"
                              SweepDirection="Clockwise"
                              IsLargeArc="{Binding Path=IsLargeArc}"
                              Size="{Binding Path=InnerSize}"/>
                </PathFigure>
              </PathGeometry>
            </Path.Data>
          </Path>                      
        </Canvas>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>
于 2012-04-03T21:41:33.757 回答