SL 4: Perilaku aneh dengan kontrol templat

Kami memiliki beberapa 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>

Dan dalam kode di belakang:

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

Saat runtime, startArrow dan endArrow berakhir di titik yang sama (walaupun keduanya disetel ke lokasi berbeda), seolah-olah keduanya berakhir di 0,0.
Faktanya, panggilan berikutnya ke Canvas.GetLeft(startArrow) ditampilkan bahwa itu adalah 0,0.
Apa yang terjadi? Mengapa objek berbeda dalam templat yang sama, diberi koordinat yang sama, berakhir di lokasi berbeda?

Terima kasih atas wawasan apa pun tentang ini....


person Number8    schedule 02.08.2010    source sumber


Jawaban (1)


Hanya sebuah pemikiran tetapi Canvas.Left dan Canvas.Top biasanya hanya berfungsi dengan baik ketika elemen ditempatkan di Canvas daripada Grid seperti yang Anda gunakan saat ini.

person AnthonyWJones    schedule 02.08.2010
comment
Saya mulai curiga itulah masalahnya... Mengapa Jalan muncul seperti yang diharapkan, sedangkan elips tidak? - person Number8; 03.08.2010
comment
StartPoint gambar dalam Path relatif terhadap elemen Path yang memuatnya sehingga muncul seperti yang diharapkan. Saya tidak begitu yakin bagaimana saya dapat menyederhanakan jawabannya lebih lanjut, agar properti Canvas.Top dan Canvas.Left dapat berfungsi pada elips, elips harus merupakan turunan dari elemen Canvas bukan elemen Grid. - person AnthonyWJones; 03.08.2010