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