<Viewbox Stretch="Uniform"> <Grid Width="730" Height="600" HorizontalAlignment="Left" VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition Width="250" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid Margin="5,10,5,5" > <Grid.ColumnDefinitions> <ColumnDefinition Width="39" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="0" Margin="5,5,10,5">X1</TextBlock> <Slider Name="tbX1" Grid.Column="1" Grid.Row="0" Value="50" Minimum="-1000" Maximum="1000"ValueChanged="tbX1_ValueChanged" ></Slider>
<TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="1" Margin="5,5,10,5">Y1</TextBlock> <Slider Name="tbY1" Grid.Column="1" Grid.Row="1" Value="200" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged" ></Slider> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="2" Margin="5,5,10,5">X2</TextBlock> <Slider Name="tbX2" Grid.Column="1" Grid.Row="2" Value="150" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged" ></Slider>
<TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="3" Margin="5,5,10,5">Y2</TextBlock> <Slider Name="tbY2" Grid.Column="1" Grid.Row="3" Value="100" Minimum="-1000" Maximum="1000"
ValueChanged="tbX1_ValueChanged"></Slider> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="4" Margin="5,5,10,5">Length</TextBlock> <Slider Name="tbLength" Grid.Column="1" Grid.Row="4" Value="100" Minimum="-1000" Maximum="1000" ValueChanged="tbX1_ValueChanged"></Slider> <TextBlock HorizontalAlignment="Right" Grid.Column="0" Grid.Row="6"
Margin="5,5,10,5">Line2</TextBlock> <CheckBox Grid.Column="1" Grid.Row="6" Content="Visible" x:Name="chk2"
IsChecked="True" Click="chk2_Click"></CheckBox> <Button Click="BtnApply_Click" Margin="15,20,15,5" Grid.Row="7" Height="25" Grid.ColumnSpan="2" Grid.Column="0">Apply</Button> <Button Click="BtnClose_Click" Margin="15,0,15,5" Grid.Row="8" Height="25" Grid.ColumnSpan="2" Grid.Column="0">Close</Button> </Grid> <Border Grid.Column="1" BorderThickness="1" BorderBrush="Blue"> <Canvas Name="canvas1" Grid.Column="1" Margin="10" ClipToBounds="True"> <TextBlock Name="tbPoint1" Canvas.Top="10">Point1</TextBlock> <TextBlock Name="tbPoint2" Canvas.Top="25">Point2</TextBlock> <TextBlock Name="tbPoint3" Canvas.Top="40">Point3</TextBlock> <TextBlock Name="tbPoint4" Canvas.Top="55">Point4</TextBlock> </Canvas> </Border> </Grid> </Viewbox>
private Line line1; private Line line2; public MainWindow() { InitializeComponent(); Rectangle rect = new Rectangle(); rect.Stroke = Brushes.Black; rect.Width = canvas1.Width; rect.Height = canvas1.Height; canvas1.Children.Add(rect); line1 = new Line(); line2 = new Line(); AddLines(); } private void AddLines() { Point pt1 = new Point(); Point pt2 = new Point(); pt1.X = Convert.ToDouble(tbX1 == null ? 200 : tbX1.Value); pt1.Y = Convert.ToDouble(tbY1 == null ? 150 : tbY1.Value); pt2.X = Convert.ToDouble(tbX2 == null ? 100 : tbX2.Value); pt2.Y = Convert.ToDouble(tbY2 == null ? 100 : tbY2.Value); double length = 0.5 * Convert.ToDouble(tbLength == null ? 100 : tbLength.Value); line1 = new Line(); line1.X1 = pt1.X; line1.Y1 = pt1.Y; line1.X2 = pt2.X; line1.Y2 = pt2.Y; line1.Stroke = Brushes.Gray; line1.StrokeThickness = 4; canvas1.Children.Add(line1); Canvas.SetLeft(tbPoint1, pt1.X); Canvas.SetTop(tbPoint1, pt1.Y); Canvas.SetLeft(tbPoint2, pt2.X); Canvas.SetTop(tbPoint2, pt2.Y); tbPoint1.Text = "Pt1(" + pt1.ToString() + ")"; tbPoint2.Text = "Pt2(" + pt2.ToString() + ")"; ////////////////////////////////////////////////////////////////////////// if (chk2.IsChecked == true) { Vector v1 = pt1 - pt2; Matrix m1 = new Matrix(); Point pt3 = new Point(); Point pt4 = new Point(); m1.Rotate(-90); v1.Normalize(); v1 *= length; line2 = new Line(); line2.Stroke = Brushes.Gray; line2.StrokeThickness = 4; line2.StrokeDashArray = DoubleCollection.Parse("3, 1"); pt3 = pt2 + v1 * m1; m1 = new Matrix(); m1.Rotate(90); pt4 = pt2 + v1 * m1; line2.X1 = pt3.X; line2.Y1 = pt3.Y; line2.X2 = pt4.X; line2.Y2 = pt4.Y; canvas1.Children.Add(line2); Canvas.SetLeft(tbPoint3, pt3.X); Canvas.SetTop(tbPoint3, pt3.Y); Canvas.SetLeft(tbPoint4, pt4.X); Canvas.SetTop(tbPoint4, pt4.Y); pt3.X = Math.Round(pt3.X, 0); pt3.Y = Math.Round(pt3.Y, 0); pt4.X = Math.Round(pt4.X, 0); pt4.Y = Math.Round(pt4.Y, 0); tbPoint3.Text = "Pt3(" + pt3.ToString() + ")"; tbPoint4.Text = "Pt4(" + pt4.ToString() + ")"; } } private void BtnApply_Click(object sender, RoutedEventArgs e) { if (line1 != null) canvas1.Children.Remove(line1); if (line2 != null) canvas1.Children.Remove(line2); AddLines(); } private void BtnClose_Click(object sender, RoutedEventArgs e) { this.Close(); } private void tbX1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (canvas1 != null) { if (line1 != null) canvas1.Children.Remove(line1); if (line2 != null) canvas1.Children.Remove(line2); AddLines(); } } private void chk2_Click(object sender, RoutedEventArgs e) { if (line1 != null) canvas1.Children.Remove(line1); if (line2 != null) canvas1.Children.Remove(line2); AddLines(); }
reference : Practical WPF Graphics Programming
'.NET > WPF 2D' 카테고리의 다른 글
WPF 2D RotateTransform (0) | 2013.07.04 |
---|---|
WPF 2D TranslateTransform (0) | 2013.07.03 |
WPF 2D Scale Transforms (0) | 2013.06.28 |
WPF 2D Object Matrix Transforms (0) | 2013.06.28 |
WPF 2D Transformations Matrix Transforms (0) | 2013.06.27 |
WPF Basic 2D Graphics Shapes (0) | 2013.06.19 |
WPF 2D 차트에 대한 사용자 정의 좌표 (0) | 2013.06.18 |
WPF 2D RenderTransform ScaleTransform Slider 바인딩 Canvas.ClipToBounds (0) | 2013.06.18 |