Почему этот простой LineSegment переходит с центра нижнего холста на верхний левый в Silverlight? - PullRequest
1 голос
/ 08 февраля 2012

У меня есть очень простой код, который «правильно» рисует короткую вертикальную черную линию на синем холсте 1024x768 в WPF (хорошо в 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 Ответ

1 голос
/ 12 февраля 2012

Проблема здесь в том, что вы создаете Path со свойством Stretch , установленным на Stretch.Fill. Я предполагаю, что вы хотите оставить путь с растяжением, установленным по умолчанию, Stretch.None.

Причина, по которой первый кодовый блок вызывает рендеринг строки в центре холста, заключается в том, что обе точки в его отдельном LineSegment имеют одинаковую X-координату, и, следовательно, Path имеет ширину 0. Очевидно, что элемент с шириной 0 не может быть растянут по горизонтали. Silverlight может попытаться растянуть ваш путь по вертикали, поскольку он имеет ненулевую высоту, но, похоже, он решает не делать этого.

Точно так же, если вы рисуете горизонтальную линию (поэтому у Path есть высота 0), Silverlight также не растягивает линию.

Во втором кодовом блоке, когда вы изменяете X-координату, даже на 1 пиксель, вы задаете для Path ненулевую ширину и высоту. Затем Silverlight может растянуть его, чтобы заполнить весь холст.

Обратите внимание, что сам элемент управления Path как контейнер для различных сегментов пути растягивается, а не отдельные сегменты линии, которые его составляют.

...