1

WPF(Silverlight 4でも)で1024x768の青いキャンバスに短い垂直の黒い線を「正しく」描画する非常に単純なコードがあります。

            <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 も変更されますが、1 ピクセルだけではありますが、線全体がキャンバスの左上にレンダリングされます。 . 改訂されたコード ビハインドを次に示します。

            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);
            }

両方がキャンバスの中央下部にレンダリングされた場合、または両方がキャンバスの左上にレンダリングされた場合、理解できました。しかし、最初のコード ブロックによって行が中央下部にレンダリングされ、2 番目のコード ブロックによって行が左上にレンダリングされる理由がわかりません。

Canvas.Top または Canvas.Left を使用していないことに注意してください。

どんな洞察もありがたく受け取った!

4

1 に答える 1

1

ここでの問題は、Stretchプロパティを に設定してPathを作成していることです。Path を Stretch をデフォルトの に設定したままにしたいと思います。Stretch.FillStretch.None

最初のコード ブロックによって線がキャンバスの中央にレンダリングされる理由は、単一の LineSegment 内の両方のポイントが同じ X 座標を持ち、したがって Path の幅が 0 であるためです。明らかに幅のある要素0 は水平方向に引き伸ばすことができません。Silverlight はパスの高さがゼロではないため、パスを垂直方向に伸ばそうとする可能性がありますが、そうしないことを選択しているようです。

同様に、水平線を描画した場合 (パスの高さが 0 になる場合)、Silverlight は線も引き伸ばしません。

2 番目のコード ブロックでは、X 座標を 1 ピクセルでも変更した場合、Path にゼロ以外の幅と高さを指定します。その後、Silverlight はそれを伸ばしてキャンバス全体を埋めることができます。

さまざまなパス セグメントのコンテナーとしてのパス コントロール自体が引き伸ばされていることに注意してください。それを構成する個々の線分は引き伸ばされていません。

于 2012-02-12T11:22:48.833 に答える