SL 4:模板控制的奇怪行为

时间:2010-08-02 17:31:19

标签: silverlight silverlight-4.0

我们有一些xaml:

    <Style TargetType="local:V_RelLine">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:V_RelLine">
                <Grid x:Name="LayoutRoot">
                    <VisualStateManager.VisualStateGroups>
                    </VisualStateManager.VisualStateGroups>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"></RowDefinition>
                    </Grid.RowDefinitions>
                    <Ellipse x:Name="startArrow" Height="20" Width="60" Fill="Green" Stroke="Blue" Visibility="Visible" /> 
                    <Path x:Name="LinePathPart"                               Visibility="Visible" Stroke="Red" StrokeDashArray="2 2" StrokeThickness="2"
                          >
                        <Path.Data>
                            <PathGeometry x:Name="LinePathGeometry" >
                                <PathFigure x:Name="linePathBezierFigure" >
                                    <BezierSegment x:Name="linePathBezierSegment" />
                                </PathFigure>
                            </PathGeometry>
                        </Path.Data>
                    </Path>
                    <Ellipse x:Name="endArrow" Height="20" Width="20" Fill="Red" Stroke="Red" Visibility="Visible" /> 

                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

在后面的代码中:

LinePathBezierFigure.StartPoint = startPoint;
Canvas.SetLeft(startArrow, startPoint.X);
Canvas.SetTop(startArrow, startPoint.Y);
/* similar for endArrow */

在运行时,startArrow和endArrow最终在同一点(即使它们设置在不同的位置),就好像它们最终为0,0。 事实上,随后对Canvas.GetLeft(startArrow)的调用显示它是0,0 到底是怎么回事?为什么同一模板中的不同对象分配相同的坐标,最终位于不同的位置?

感谢您对此有任何见解......

1 个答案:

答案 0 :(得分:0)

只是一个想法,但Canvas.LeftCanvas.Top通常只有当元素放在Canvas而不是Grid时才能正常工作。