2012-02-08 2 views
1

WPF (잘 실버 라이트 4)의 1024x768 파란 캔버스에 '올바르게'짧은 검은 색 선을 그리는 아주 간단한 코드가 있습니다. 내가 라인 세그먼트 (segment)의 종점을 변경하는 경우 대신 상대 시작 지점에서 Y를 변경하는 나는 또한 변경할 수 있도록왜이 간단한 LineSegment가 Silverlight의 캔버스 중심에서 하단 왼쪽으로 점프합니까?

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

입니다 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

여기서 문제는 Stretch 속성이 Stretch.Fill으로 설정된 Path을 만드는 것입니다. 늘이기 경로를 기본값 인 Stretch.None으로 설정하고 싶다고 생각합니다.

첫 번째 코드 블록이 선을 캔버스의 가운데에 렌더링하게하는 이유는 단일 LineSegment의 두 점이 모두 동일한 X 좌표를 가지므로 Path의 너비가 0이기 때문입니다. 분명히 너비가 0 인 요소는 가로로 늘일 수 없습니다. Silverlight는 높이가 0이 아니므로 경로를 세로로 늘리려고 시도 할 수 있지만 선택하지 않는 것 같습니다.

마찬가지로 가로 선을 그리면 (경로의 높이가 0이므로) Silverlight에서 선을 늘리지 않습니다.

두 번째 코드 블록에서 X 좌표를 1 픽셀 씩 변경해도 경로에 0이 아닌 너비와 높이가 부여됩니다. Silverlight는 전체 캔버스를 채우기 위해 그것을 늘릴 수 있습니다.

다양한 경로 세그먼트의 컨테이너 인 Path 컨트롤 자체가 확장되는 것이지 개별 경로 세그먼트를 구성하는 개별 세그먼트가 아니라는 점에 유의하십시오.

+0

감사합니다. 루크 - 맞습니다. – dumbledad