1

我有一些非常简单的代码可以“正确”在 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。

任何见解都感激不尽!

4

1 回答 1

1

这里的问题是您正在创建Path并将Stretch属性设置为Stretch.Fill. 我想您想将 Stretch 设置为默认路径,Stretch.None.

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

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

在您的第二个代码块中,当您更改 X 坐标时,即使更改了 1 个像素,您也会为路径提供非零宽度和高度。Silverlight 然后可以将其拉伸以填充整个 Canvas。

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

于 2012-02-12T11:22:48.833 回答