为什么这个简单的LineSegment从Silverlight中的画布中心底部跳到左上角?

时间:2012-02-08 17:00:37

标签: wpf silverlight wpf-controls line-segment

我有一些非常简单的代码,'正确'在WPF的1024x768蓝色画布上绘制一条短的垂直黑线(在Silverlight 4中)。

            <UserControl x:Class="SimpleCanvas.MainPage"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                mc:Ignorable="d"
                Loaded="UserControl_Loaded">
                <Grid x:Name="LayoutRoot" Background="White">
                    <Canvas x:Name="PathCanvas" Width="1024" Height="768" Background="Blue"/>
                </Grid>
            </UserControl>

这是代码隐藏的

            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                var myPathFigure = new PathFigure
                {
                    StartPoint = new Point(492, 748)
                };

                var line1 = new LineSegment
                {
                    Point = new Point(492, 708)
                };

                myPathFigure.Segments.Add(line1);

                var myPathGeometry = new PathGeometry();
                myPathGeometry.Figures.Add(myPathFigure);

                var myPath = new Path
                {
                    Data = myPathGeometry,
                    Stretch = Stretch.Fill,
                    Stroke = new SolidColorBrush(Color.FromArgb(0xFF, 0x0, 0x0, 0x0)),
                    StrokeThickness = 10
                };

                PathCanvas.Children.Add(myPath);
            }

现在,如果我改变线段的终点,那么不是仅仅从起点改变Y而是改变X,尽管只有一个像素,整条线在左上角呈现画布。这是修改后的代码隐藏。

            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                var myPathFigure = new PathFigure
                {
                    StartPoint = new Point(492, 748)
                };

                var line1 = new LineSegment
                {
                    Point = new Point(491, 708)
                };

                myPathFigure.Segments.Add(line1);

                var myPathGeometry = new PathGeometry();
                myPathGeometry.Figures.Add(myPathFigure);

                var myPath = new Path
                {
                    Data = myPathGeometry,
                    Stretch = Stretch.Fill,
                    Stroke = new SolidColorBrush(Color.FromArgb(0xFF, 0x0, 0x0, 0x0)),
                    StrokeThickness = 10
                };

                PathCanvas.Children.Add(myPath);
            }

如果两者都在画布的中间底部渲染,或者两者都渲染在画布的左上角,我就能理解。但我不明白为什么第一个代码块导致行渲染中心 - 底部,第二个代码块导致行渲染左上角。

请注意,我没有使用Canvas.Top或Canvas.Left。

感激地收到任何见解!

1 个答案:

答案 0 :(得分:1)

此处的问题是您创建的Path Stretch属性设置为Stretch.Fill。我想你想把Stretch的Path设置为默认值Stretch.None

第一个代码块导致在画布中心渲染线的原因是因为其单个LineSegment中的两个点具有相同的X坐标,因此Path的宽度为0.显然宽度为0的元素不能水平拉伸。 Silverlight可能会尝试垂直拉伸你的Path,因为它的高度非零,但它似乎选择不这样做。

同样,如果绘制一条水平线(因此Path的高度为0),Silverlight也不会拉伸该线。

在你的第二个代码块中,当你改变X坐标时,即使是1个像素,你也可以给Path一个非零的宽度和高度。然后Silverlight可以拉伸它以填充整个画布。

请注意,Path控件本身(作为各个路径段的容器)正在被拉伸,而不是构成它的各个线段。