WPF draw circle equals with ellipse has same width and height,zoom

<Window x:Class="WpfApp2.MainWindow"
        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"
        xmlns:local="clr-namespace:WpfApp2" x:Name="mainWindow"
        mc:Ignorable="d"   
        Title="MainWindow" Height="450" Width="800" WindowState="Maximized" >
    <Window.Resources>
        <Style x:Key="MyStyle" TargetType="{x:Type GridSplitter}">
            <Setter Property="Width" Value="10"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate  TargetType="{x:Type GridSplitter}">
                        <Grid>
                            <Button Content="⁞" />
                            <Rectangle Fill="Red" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style> 
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" >
            <Button Content="Clear" x:Name="clearBtn" Click="clearBtn_Click"/>
            <GridSplitter Width="10"></GridSplitter>
            <Button Content="Reset" x:Name="resetBtn" Click="resetBtn_Click"/>
        </StackPanel>
        <Grid x:Name="gd" Grid.Row="1">
            <Grid.RenderTransform>
                <TranslateTransform x:Name="tt"/>
            </Grid.RenderTransform>
            <Canvas x:Name="cvs" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible">
                
            </Canvas>            
        </Grid>
        <StatusBar Grid.Row="2">
            <StatusBarItem>
                <TextBlock Name="statusTB" FontSize="20"/>
            </StatusBarItem>
        </StatusBar>
    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        double scale = 1.0;
        double delta = 0.5;
        double GlobalX=0, GlobalY=0;
        int level = 5, minLevel = 5, maxLevel = 1000;
        Point m_start;
        Vector m_startOffset;
        public MainWindow()
        {
            InitializeComponent();
            ShowStatus();
            InitEvents();
        }

        private void InitEvents()
        { 
            mainWindow.MouseWheel += MainWindow_MouseWheel;
            mainWindow.Loaded += MainWindow_Loaded;
            MouseMove += MainWindow_MouseMove;
            gd.MouseMove += Gd_MouseMove;
            gd.MouseDown += Gd_MouseDown;
            gd.MouseUp += Gd_MouseUp;
        }

        private void Gd_MouseUp(object sender, MouseButtonEventArgs e)
        {
            FrameworkElement element = sender as Grid;
            if(element!=null)
            {
                element.ReleaseMouseCapture();
                gd.ReleaseMouseCapture();
            } 
        }

        private void Gd_MouseDown(object sender, MouseButtonEventArgs e)
        {
            FrameworkElement element = sender as Grid;
            if(element!=null)
            {
                TranslateTransform translate = element.RenderTransform as TranslateTransform;
                m_start = e.GetPosition(gd);
                m_startOffset = new Vector(translate.X, translate.Y);
                element.CaptureMouse();
            } 
        }

        private void Gd_MouseMove(object sender, MouseEventArgs e)
        {
            FrameworkElement element = sender as Grid;
            if(element!=null)
            {
                TranslateTransform translate = element.RenderTransform as TranslateTransform;

                if (element.IsMouseCaptured)
                {
                    Vector offset = Point.Subtract(e.GetPosition(gd), m_start);
                    translate.X = e.GetPosition(gd).X;
                    translate.Y = e.GetPosition(gd).Y;
                }
            } 
        }

        private void MainWindow_MouseMove(object sender, MouseEventArgs e)
        {
            var pt = e.GetPosition(gd);
            GlobalX = pt.X;
            GlobalY= pt.Y;
            ShowStatus();
            var elem = Mouse.DirectlyOver;
            if(elem!=null)
            {
                var ellipse = elem as Ellipse;
                if(ellipse!=null)
                {
                    ellipse.ToolTip = ellipse.Tag.ToString();
                }
            }
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            InitShapes();
        }

        private void MainWindow_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (e.Delta > 0)
            {
                if (level < maxLevel)
                {
                    level++;
                    ZoomIn();
                }
            }
            else
            {
                if (level > minLevel)
                {
                    level--;
                    ZoomOut();
                }
            }

            ShowStatus();
        }
         
        private void InitShapes()
        {
            Point pt = new Point(1, 1);
            int interval = 10;
            int widthLoops = (int)(this.ActualWidth / interval);
            System.Diagnostics.Debug.WriteLine(widthLoops); 
            int heightLoops = (int)(this.ActualHeight / interval);
            System.Diagnostics.Debug.WriteLine(heightLoops);
            int num = 0;
            for (int i = 0; i < widthLoops; i++)
            {
                for (int j = 0; j < heightLoops; j++)
                {
                    double px = pt.X + interval * i;
                    double py = pt.Y + interval * j;
                    if (px < this.ActualWidth && py < this.ActualHeight)
                    {
                        ++num;
                        Ellipse newEllipse = new Ellipse();
                        newEllipse.Visibility = Visibility.Visible;
                        newEllipse.Height = 5;
                        newEllipse.Width = 5;
                        newEllipse.SetValue(Canvas.LeftProperty, px);
                        newEllipse.SetValue(Canvas.TopProperty, py);
                        SolidColorBrush mySolidColorBrush = new SolidColorBrush();
                        mySolidColorBrush.Color = Color.FromArgb(255, 255, 0, 0);
                        newEllipse.Fill = mySolidColorBrush;
                        newEllipse.Stroke = Brushes.Black;
                        newEllipse.StrokeThickness = 1;
                        newEllipse.Tag = px + "," + py;
                        cvs.Children.Add(newEllipse);
                    }
                }
            }
        }

        private void ShowStatus()
        {
            Dispatcher.BeginInvoke(new Action(() =>
            { 
                statusTB.Text = "Level: " + level+",X:"+GlobalX+",Y:"+GlobalY;
            }));
        }

        private void ZoomOut()
        {
            scale -= delta;
            gd.LayoutTransform = new ScaleTransform(scale, scale);
        }

        private void clearBtn_Click(object sender, RoutedEventArgs e)
        {
            cvs.Children.Clear();
        }

        private void resetBtn_Click(object sender, RoutedEventArgs e)
        {
            Reset();
        }

        private void Reset()
        {
            scale = 1.0;
            level = 5;
            GlobalX = 0;
            GlobalY = 0;
            gd.LayoutTransform = new ScaleTransform(1.0, 1.0);
            InitShapes();
            ShowStatus();
        }

        private void ZoomIn()
        {
            scale += delta;
            gd.LayoutTransform = new ScaleTransform(scale, scale);
        } 
    }
}

 

 

 

posted @ 2022-01-29 10:32  FredGrit  阅读(108)  评论(0编辑  收藏  举报