SL 4: Странное поведение с шаблонным управлением

У нас есть 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.
Что происходит? Почему разные объекты в одном шаблоне с одинаковыми координатами оказываются в разных местах?

Спасибо за любое понимание этого....


person Number8    schedule 02.08.2010    source источник


Ответы (1)


Просто мысль, но Canvas.Left и Canvas.Top обычно хорошо работают только тогда, когда элементы размещены в Canvas, а не в Grid, как вы используете сейчас.

person AnthonyWJones    schedule 02.08.2010
comment
Я начинаю подозревать, что проблема в этом... Почему Путь выглядит так, как ожидалось, а эллипсы - нет? - person Number8; 03.08.2010
comment
StartPoint фигуры в Path относится к содержащему элементу Path, поэтому он выглядит так, как ожидалось. Я не совсем уверен, как я могу упростить ответ, чтобы свойства Canvas.Top и Canvas.Left работали с эллипсами, эллипсы должны быть дочерними элементами элемента Canvas, а не элемента Grid. - person AnthonyWJones; 03.08.2010