首页 > 编程语言 >WPF C# implement scaletransform and translatetransfrom programmatically

WPF C# implement scaletransform and translatetransfrom programmatically

时间:2024-08-02 19:56:47浏览次数:9  
标签:scaler C# translatetransfrom System private scaletransform tg using void

private void InitRenderTransfrom()
{
    TransformGroup tg = new TransformGroup();
    ScaleTransform st = new ScaleTransform();
    if (!tg.Children.Contains(st))
    {
        tg.Children.Add(st);
        scaler = st;
    }
    TranslateTransform tt = new TranslateTransform();
    if (!tg.Children.Contains(tt))
    {
        tg.Children.Add(tt);
        translater = tt;
    }
    img.RenderTransform = tg;
}

 

 

 

 

 

 

 

 

 

 

//xaml
<Window x:Class="WpfApp3.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:WpfApp3"
        mc:Ignorable="d" WindowState="Maximized"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="250"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <ListView x:Name="lv" Grid.Column="0" ItemsSource="{Binding BooksCollection,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                  SelectedIndex="0"
                  SelectionChanged="ListView_SelectionChanged">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Image Source="{Binding Path=Content.ImgUrl,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ListBoxItem}}"
                           Width="250" Height="500" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <Grid Grid.Column="1" x:Name="imgGrid" Background="Transparent"
              MouseWheel="ImgGrid_MouseWheel" MouseDown="ImgGrid_MouseDown"
              MouseUp="ImgGrid_MouseUp" MouseMove="ImgGrid_MouseMove"
              ClipToBounds="True">
            <Image x:Name="img"
                   Source="{Binding Path=SelectedItem.ImgUrl,ElementName=lv}"/>
        </Grid>
    </Grid>
</Window>



//cs
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
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 WpfApp3
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window, INotifyPropertyChanged
    {
        public MainWindow()
        {
            InitializeComponent();
            InitData();
            InitRenderTransfrom();
            this.DataContext = this;
        }

        private void InitData()
        {
            BooksCollection = new ObservableCollection<Book>();
            var imgsList = System.IO.Directory.GetFiles(@"../../Images")?.ToList();
            int len = imgsList.Count;
            for (int i = 0; i < 10000; i++)
            {
                BooksCollection.Add(new Book()
                {
                    Id = i + 1,
                    Name = $"Name_{i + 1}",
                    ImgUrl = imgsList[i % len]
                });
            }
        }

        private void InitRenderTransfrom()
        {
            TransformGroup tg = new TransformGroup();
            ScaleTransform st = new ScaleTransform();
            if (!tg.Children.Contains(st))
            {
                tg.Children.Add(st);
                scaler = st;
            }
            TranslateTransform tt = new TranslateTransform();
            if (!tg.Children.Contains(tt))
            {
                tg.Children.Add(tt);
                translater = tt;
            }
            img.RenderTransform = tg;
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            var handler = PropertyChanged;
            if (handler != null)
            {
                handler?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        private ObservableCollection<Book> booksCollection;
        public ObservableCollection<Book> BooksCollection
        {
            get
            {
                return booksCollection;
            }
            set
            {
                if (value != booksCollection)
                {
                    booksCollection = value;
                    OnPropertyChanged(nameof(BooksCollection));
                }
            }
        }

        private ScaleTransform scaler { get; set; }
        private TranslateTransform translater { get; set; }
        private Point currentPt { get; set; }
        private bool isMoving = false;


        private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (scaler != null)
            {
                scaler.ScaleX = 1.0;
                scaler.ScaleY = 1.0;
                scaler.CenterX = 0;
                scaler.CenterY = 0;
            }

            if (translater != null)
            {
                translater.X = 0;
                translater.Y = 0;
            }
        }

        private void ImgGrid_MouseWheel(object sender, MouseWheelEventArgs e)
        {
            if (scaler != null)
            {
                if (e.Delta > 0)
                {
                    scaler.ScaleX *= 1.2;
                    scaler.ScaleY *= 1.2;
                }
                else
                {
                    scaler.ScaleX /= 1.2;
                    scaler.ScaleY /= 1.2;
                }
                scaler.CenterX = e.GetPosition(img).X;
                scaler.CenterY = e.GetPosition(img).Y;

                if (scaler.ScaleX > 100 || scaler.ScaleX < 0.01)
                {
                    MessageBox.Show($"ScaleX:{scaler.ScaleX},ScaleY:{scaler.ScaleY},had exceeded more than 100X+,it will reset to 1");
                    scaler.ScaleX = 1.0;
                    scaler.ScaleY = 1.0;
                    scaler.CenterX = 0;
                    scaler.CenterY = 0;
                }
            }
        }

        private void ImgGrid_MouseDown(object sender, MouseButtonEventArgs e)
        {
            currentPt = e.GetPosition(imgGrid);
        }

        private void ImgGrid_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton == MouseButton.Left
                && e.ButtonState == MouseButtonState.Released
                && isMoving && translater != null)
            {
                var newPt = e.GetPosition(imgGrid);
                translater.X += (newPt.X - currentPt.X);
                translater.Y += (newPt.Y - currentPt.Y);
                isMoving = false;
            }
        }

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

    public class Book
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ImgUrl { get; set; }
    }
}

 

标签:scaler,C#,translatetransfrom,System,private,scaletransform,tg,using,void
From: https://www.cnblogs.com/Fred1987/p/18339501

相关文章

  • PCIe学习笔记(15)
    设备就绪状态(DeviceReadinessStatus,DRS)消息(DeviceReadinessStatus(DRS)是PCIe规范中引入的一种机制,旨在改进设备初始化和就绪状态的检测与报告。在以往的PCIe版本中,系统通常依赖于固定的超时机制来判断设备是否已经成功初始化并准备好进行数据传输。然而,这种方法存......
  • PCIe学习笔记(13)
    电源管理消息电源管理消息的定义规则如下:•电源管理消息的定义如表所示。•电源管理消息不包括数据负载(TLP类型是Msg)。•Length字段保留。•对于PM_Active_State_Nak消息,请求者ID中的功能号字段必须包含发送消息的下游端口的功能号,或者000b,以便与早期版本兼容。•对于......
  • Android开发 - RecyclerView 类详解
    什么是RecyclerViewRecyclerView是Android的一个控件,用来展示长列表或网格的内容,它比以前的ListView更加灵活和高效列表展示:想象你在手机上浏览一个长长的商品列表或图片网格。RecyclerView就是用来展示这样的内容的控件高效显示:如果你有一万件商品,RecyclerView不会一......
  • NewStarCTF WEEK5|WEB pppython?
    对源码进行简单的分析<?php//检查`hint`请求参数是否等于指定的数组值if($_REQUEST['hint']==["your?","mine!","hint!!"]){//如果条件满足,设置响应内容类型为纯文本header("Content-type:text/plain");//执行系统命令`ls/-la`列出......
  • Navicat Premium(数据库管理) v17 授权版
    Navicat17全新升级,软件增强了数据库管理和数据分析的功能体验。其中包括模型设计与同步、数据字典、数据分析(dataprofiling)、用户体验、查询优化、BI功能集成MongoDB/Snowflake、专注模式、Redis哨兵模式与平台扩展LinuxARM等。此次升级让用户在数据库的创建、管理、......
  • JavaScript 中的闭包和事件委托
    包(Closures)闭包是JavaScript中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕。闭包可以帮助我们实现数据的私有化、封装和模块化,使代码更简洁、易读和可维护。闭包的定义简单来说,闭包是指有权访问另一个函数作用域中......
  • 轻松搞定 Nginx 在 CentOS 和 Ubuntu 上的安装与配置
    注:这是对我以前博客进行优化后再次发布的,博客中的截图为以前的。原博客已删除。如何安装nginxnginx是一款开源、高性能的Web和反向代理服务器,支持HTTP、HTTPS、SMTP、POP3和IMAP协议。由于其轻量级、资源占用少和强大的并发能力,nginx广泛用于多种场景。本文将介绍如何在CentOS和......
  • c语言中的地址与指针的概念,及变量的指针和指向变量的指针变量
    C语言中的地址、指针、以及变量的指针与指向变量的指针变量。1.地址(Address)在C语言中,每个变量在内存中都有一个唯一的内存地址。这个地址是变量存储的位置的标识符。可以通过& 运算符来获取一个变量的地址。#include<stdio.h>intmain(){  intx=10;  ......
  • c语言结构体的概述,定义结构体变量类型的方法,结构体变量的引用,结构体变量的初始化,结构
    1.C语言结构体的概述在C语言中,结构体(struct)是一种复合数据类型,用于将不同类型的数据组合在一起。它可以包含基本数据类型(如int、float、char等)以及其他结构体。结构体非常适合表示具有多种属性的复杂数据,如学生信息(包含姓名、年龄、成绩等)或坐标点(包含x和y坐标)。结构......
  • ElasticSearch分布式搜索引擎原理与代码实例讲解
    ElasticSearch分布式搜索引擎原理与代码实例讲解1.背景介绍1.1问题的由来在当今的数字时代,海量的数据被不断产生和存储。如何高效地检索和管理这些庞大的数据集成为了一个关键挑战。传统的关系型数据库虽然在事务处理和数据一致性方面表现出色,但在处理非结构化数据和......