首页 > 其他分享 >WPF中通过附加属性实现任意控件拖动调整大小

WPF中通过附加属性实现任意控件拖动调整大小

时间:2023-12-22 11:24:48浏览次数:34  
标签:控件 拖动 private Element static element resizingElement WPF null

public class ResizeBehavior
    {
        // 附加属性用于标识控件是否可调整大小
        public static readonly DependencyProperty IsResizableProperty =
            DependencyProperty.RegisterAttached("IsResizable", typeof(bool), typeof(ResizeBehavior), new PropertyMetadata(false, OnIsResizableChanged));

        public static bool GetIsResizable(DependencyObject obj)
        {
            return (bool)obj.GetValue(IsResizableProperty);
        }

        public static void SetIsResizable(DependencyObject obj, bool value)
        {
            obj.SetValue(IsResizableProperty, value);
        }

        // 当 IsResizable 附加属性发生改变时触发的回调方法
        private static void OnIsResizableChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            if (d is FrameworkElement element)
            {
                if ((bool)e.NewValue)
                {
                    element.MouseLeftButtonDown += Element_MouseLeftButtonDown;
                    element.MouseMove += Element_MouseMove;
                    element.MouseLeftButtonUp += Element_MouseLeftButtonUp;
                }
                else
                {
                    element.MouseLeftButtonDown -= Element_MouseLeftButtonDown;
                    element.MouseMove -= Element_MouseMove;
                    element.MouseLeftButtonUp -= Element_MouseLeftButtonUp;
                }
            }
        }

        private static bool isResizing = false;
        private static Point originalMousePos;
        private static double originalWidth;
        private static FrameworkElement resizingElement = null!;

        // 鼠标左键按下时触发的事件处理程序
        private static void Element_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            isResizing = true;
            originalMousePos = e.GetPosition(null);
            originalWidth = ((FrameworkElement)sender).ActualWidth;
            resizingElement = (FrameworkElement)sender;

            // 添加对鼠标左键按下事件的处理
            if (resizingElement != null)
            {
                resizingElement.CaptureMouse(); // 捕获鼠标
            }
        }

        // 鼠标移动时触发的事件处理程序
        private static void Element_MouseMove(object sender, MouseEventArgs e)
        {
            if (isResizing && resizingElement != null)
            {
                Point currentMousePos = e.GetPosition(null);
                double delta = currentMousePos.X - originalMousePos.X;
                double newWidth = originalWidth + delta;

                if (newWidth > 0)
                {
                    resizingElement.Width = newWidth;
                }
            }
        }

        // 鼠标左键释放时触发的事件处理程序
        private static void Element_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (isResizing && resizingElement != null)
            {
                isResizing = false;
                resizingElement.ReleaseMouseCapture(); // 释放鼠标捕获
                resizingElement = null!;
            }
        }
    }

  

<Border service:ResizeBehavior.IsResizable="True" BorderThickness="2" BorderBrush="Gray" Cursor="SizeWE"></Border>

 

标签:控件,拖动,private,Element,static,element,resizingElement,WPF,null
From: https://www.cnblogs.com/htsboke/p/17920876.html

相关文章

  • wpf 元素设置焦点无效的问题
    首先确定元素的Enabled, Visible, Loaded,and Focusable这四个属性,如果这些属性的任何一个为false,则不能设置焦点到该元素上。如果Focusable为false,设置焦点的方式可以先在鼠标左键按下事件中,设置Focusable,如下:userControl.MouseLeftButtonDown+=delegate{userCo......
  • WPF自定义控件之图形解锁控件 ScreenUnLock
    ScreenUnLock与智能手机上的图案解锁功能一样。通过绘制图形达到解锁或记忆图形的目的。本人突发奇想,把手机上的图形解锁功能移植到WPF中。也应用到了公司的项目中。在创建ScreenUnLock之前,先来分析一下图形解锁的实现思路。1.创建九宫格原点(或更多格子),每个点定义一个坐标值......
  • .NET Core 3 WPF MVVM框架 Prism系列之导航系统
    本文将介绍如何在.NETCore3环境下使用MVVM框架Prism基于区域Region的导航系统git在讲解Prism导航系统以前,咱们先来看看一个例子,我在以前的demo项目建立一个登陆界面:github 咱们看到这里是否是一开始想象到使用WPF带有的导航系统,经过Frame和Page进行页面跳转,而后经过导航日志......
  • Safari 17信任站点修改造成的工商银行网银控件无法正常使用
    MacOS14.1中,Safari浏览器版本17.1,变更了信任站点流程。在工商银行使用JSP技术开发的网页上存在点击“在此网站上启用”但是检测不到扩展已安装的问题。原因工行个人网银登录网⻚使用jsp开发,⻚面情况非常复杂,嵌套了多个不同网址。通过日志可以发现还请求了epass.icbc.com.......
  • 【WPF】 BasedOn的用法
    BasedOn用于样式的继承。这里的已经继承了一个样式  此时,我们想在Resource中让他附加新的样式,但是这样不成功  修改如下:去掉了之前的样式选择  我们使用BasedOn让其叠加样式 ......
  • 【C#/WPF】Bitmap、BitmapImage、ImageSource 、byte[]转换问题
    C#/WPF项目中,用到图像相关的功能时,涉及到多种图像数据类型的相互转换问题,这里做了个整理。包含的内容如下:Bitmap和BitmapImage相互转换。RenderTargetBitmap–>BitmapImageImageSource–>BitmapBitmapImage和byte[]相互转换。byte[]–>BitmapStackOverflow上有很......
  • WPF显示网络图片的几种方法
    1、利用数据流1Imageimg;2byte[]btyarray=GetImageFromResponse(imageUrl);34//字节数据转流5MemoryStreamms=newMemoryStream(btyarray);67//重点:设置Image控件的Source为流格式的图片数据8img.Source=BitmapFrame.Create(ms,BitmapCrea......
  • Wpf Bitmap(Image)Base64,Url,文件Path,Stream转BitmapSource(ImageSource),无需外部d
    直接上代码usingSystem;usingSystem.Drawing;usingSystem.IO;usingSystem.Windows.Forms;usingSystem.Windows.Media.Imaging;namespaceCommonUtils{///<summary>///Windows图片处理///</summary>publicstaticclassWindowsImage......
  • WinForm/WPF 打包安装程序exe
     以下是关于WinForm/WPF打包安装程序exe的内容如果打包的exe文件,需要拥有管理员权限,则先配置下面的第三步,设置管理员权限(非必须) 一、安装扩展程序打包exe,需要安装:MicrosoftVisualStudioInstallerProjects2022安装的两种方式:1、手动下载文件安装,2、vs中扩展下载安装......
  • WPF ListView GridView表头Header修改外观的方式
    <Window.Resources><DataTemplatex:Key="BlueHeader"><StackPanelOrientation="Horizontal"Margin="-5,-5,-5,-5"Width="120"><StackPanel.Background><LinearGradi......