WPF canvas mousewheel to zoom in or out

<Window x:Class="WpfApp133.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:WpfApp133"
        mc:Ignorable="d" WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Canvas x:Name="cvs" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                MouseWheel="cvs_MouseWheel"  
                MouseDown="cvs_MouseDown" 
                MouseMove="cvs_MouseMove"
                MouseUp="cvs_MouseUp">
            <Viewbox> 
            <Image Source="\Images\cl1.jpg" Stretch="UniformToFill" />
            </Viewbox>
            <Canvas.RenderTransform>
                <TransformGroup>
                    <ScaleTransform x:Name="scaler"/>
                    <TranslateTransform x:Name="translater"/>
                </TransformGroup> 
            </Canvas.RenderTransform>
        </Canvas>
    </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 WpfApp133
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
            DrawEllipse();
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            int width = (int)this.ActualWidth;
            int height = (int)this.ActualHeight;
            for (int i = 0; i < width; i += 100)
            {
                for (int j = 0; j < height; j += 100)
                {
                    Ellipse elp = new Ellipse();
                    elp.Width = 10;
                    elp.Height = 10;
                    elp.Fill = new SolidColorBrush(Colors.Red);
                    Canvas.SetLeft(elp, i);
                    Canvas.SetTop(elp, j);
                    cvs.Children.Add(elp);
                }
            }
        }

        private void DrawEllipse()
        {

        }

        private void cvs_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            Point pt = e.GetPosition(this);
            if (e.Delta > 0)
            {
                scaler.ScaleX *= 1.2;
                scaler.ScaleY *= 1.2;
            }
            else
            {
                scaler.ScaleX /= 1.2;
                scaler.ScaleY /= 1.2;
            }
            scaler.CenterX = pt.X;
            scaler.CenterY = pt.Y;
        }

        Point previousPt;
        bool isMoving = false;
        private void cvs_MouseDown(object sender, MouseButtonEventArgs e)
        {
            previousPt = e.GetPosition(this);
        }

        private void cvs_MouseMove(object sender, MouseEventArgs e)
        {
            isMoving= true;
        }

        private void cvs_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if(isMoving && e.ChangedButton==MouseButton.Left && e.ButtonState==MouseButtonState.Released)
            {
                Point newPt=e.GetPosition(this);
                double deltaX=newPt.X - previousPt.X;
                double deltaY = newPt.Y - previousPt.Y;
                translater.X += deltaX;
                translater.Y += deltaY;
                isMoving= false;
            }
        }
    }
}

 

posted @ 2024-06-03 20:09  FredGrit  阅读(8)  评论(0编辑  收藏  举报