본문 바로가기

.NET/WPF 2D

WPF 2D 차트에 대한 사용자 정의 좌표

반응형

<Window x:Class="WpfApplication5.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         Title="2D 차트에 대한 사용자 정의 좌표" Height="420"  Width="360"> <Viewbox Stretch="Uniform"> <StackPanel Height="420" Width="360"> <Canvas x:Name="plotCanvas" ClipToBounds="True"                      Width="300" Height="250"                      Margin="30,30,30,30"> <Rectangle x:Name="plotArea"      Width="300" Height="250"      Stroke="Black"      StrokeThickness="1"/> </Canvas> <Grid Width="340" Height="100"                HorizontalAlignment="Left"                VerticalAlignment="Top"> <Grid.ColumnDefinitions> <ColumnDefinition Width="60" /> <ColumnDefinition Width="110" /> <ColumnDefinition Width="60"/> <ColumnDefinition Width="110" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.Row="0" Margin="25,5,10,5">XMin</TextBlock> <TextBox Name="tbXMin" Grid.Column="1" Grid.Row="0"   Text="0" />

<TextBlock Grid.Column="2" Grid.Row="0" Margin="25,5,10,5">XMax</TextBlock> <TextBox Name="tbXMax" Grid.Column="3" Grid.Row="0" >10</TextBox> <TextBlock Grid.Column="0" Grid.Row="1" Margin="25,5,10,5">YMin</TextBlock> <TextBox Name="tbYMin" Grid.Column="1" Grid.Row="1"   >0</TextBox> <TextBlock Grid.Column="2" Grid.Row="1" Margin="25,5,10,5">YMax</TextBlock> <TextBox Name="tbYMax" Grid.Column="3" Grid.Row="1">10</TextBox> <Button Click="btnApply_Click"                           Margin="40,20,20,0"                          Height="25" Grid.ColumnSpan="2"                          Grid.Column="0" Grid.Row="2">Apply</Button> <Button Click="btnClose_Click"                          Margin="40,20,20,0"                           Height="25" Grid.ColumnSpan="2"                          Grid.Column="2" Grid.Row="2">Close</Button> </Grid> </StackPanel> </Viewbox> </Window>




public partial class MainWindow : Window
    {
        private double xMin = 0.0;
        private double xMax = 10.0;
        private double yMin = 0.0;
        private double yMax = 10.0;
        private Line line1;
        private Polyline polyline1;
 
 
        public MainWindow()
        {
            InitializeComponent();
            AddGraphics();
        }
 
        private void AddGraphics()
        {
            line1 = new Line();
            line1.X1 = XNormalize(2.0);
            line1.Y1 = YNormalize(4.0);
            line1.X2 = XNormalize(8.0);
            line1.Y2 = YNormalize(10.0);
            line1.Stroke = Brushes.Blue;
            line1.StrokeThickness = 2;
            //line1.StrokeDashArray = new DoubleCollection(){};
            plotCanvas.Children.Add(line1);
 
            polyline1 = new Polyline();
            polyline1.Points.Add(new Point(XNormalize(8),
                YNormalize(8)));
            polyline1.Points.Add(new Point(XNormalize(6),
                YNormalize(6)));
            polyline1.Points.Add(new Point(XNormalize(6),
                YNormalize(4)));
            polyline1.Points.Add(new Point(XNormalize(4),
                YNormalize(4)));
            polyline1.Points.Add(new Point(XNormalize(4),
                YNormalize(6)));
            polyline1.Points.Add(new Point(XNormalize(6),
                YNormalize(6)));
            polyline1.Stroke = Brushes.Red;
            polyline1.StrokeThickness = 5;
            plotCanvas.Children.Add(polyline1);
        }
 
        private double XNormalize(double x)
        {
            double result = (x - xMin*
                   plotCanvas.Width / (xMax - xMin);
            return result;
        }
 
        private double YNormalize(double y)
        {
            double result = plotCanvas.Height - (y - yMin*
                plotCanvas.Height / (yMax - yMin);
            return result;
        }
 
        private void btnApply_Click(object senderRoutedEventArgs e)
        {
            xMin = Convert.ToDouble(tbXMin.Text);
            xMax = Convert.ToDouble(tbXMax.Text);
            yMin = Convert.ToDouble(tbXMin.Text);
            yMax = Convert.ToDouble(tbYMax.Text);
            plotCanvas.Children.Remove(line1);
            plotCanvas.Children.Remove(polyline1);
            AddGraphics();
        }
 
        private void btnClose_Click(object senderRoutedEventArgs e)
        {
            this.Close();
        }
    }









reference : Practical WPF Graphics Programming