WPF拖动事件

2023-10-27

1、定义一个Dragthumb模板

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:DeepLearningEditor">

    <!-- DragThumb Default Template -->
    <Style TargetType="{x:Type local:DragThumb}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:DragThumb}">
                    <Rectangle Fill="Transparent"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <!-- DesignerItem Style -->
    <Style TargetType="{x:Type local:DesignerInkItem}">
        <Setter Property="MinWidth" Value="10"/>
        <Setter Property="MinHeight" Value="10"/>
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:DesignerInkItem}">
                    <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                        <!-- PART_DragThumb -->
                        <local:DragThumb x:Name="PART_DragThumb" 
                                     Panel.ZIndex="10"
                                         Visibility="Collapsed"
                                     Cursor="Hand"/>
                        <!-- PART_ContentPresenter -->
                        <ContentPresenter x:Name="PART_ContentPresenter"
                                          HorizontalAlignment="Stretch"
                                          VerticalAlignment="Stretch"
                                          Content="{TemplateBinding ContentControl.Content}"
                                          Margin="{TemplateBinding ContentControl.Padding}"/>

                    </Grid>

                    <ControlTemplate.Triggers>
                        <DataTrigger Value="True" Binding="{Binding RelativeSource={RelativeSource Self},Path=IsSelected}">
                            <Setter TargetName="PART_DragThumb" Property="Visibility" Value="Visible"/>
                        </DataTrigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
                
            </Setter.Value>
        </Setter>
    </Style>



</ResourceDictionary>

2、编写事件

 public DragThumb()
        {
            base.DragDelta += new DragDeltaEventHandler(DragThumb_DragDelta);
        }

        void DragThumb_DragDelta(object sender, DragDeltaEventArgs e)
        {
            DesignerItem designerItem = this.DataContext as DesignerItem;
            DesignerCanvas designer = VisualTreeHelper.GetParent(designerItem) as DesignerCanvas;
            if (designerItem != null && designer != null && designerItem.IsSelected)
            {
                double minLeft = double.MaxValue;
                double minTop = double.MaxValue;

                // we only move DesignerItems
                var designerItems = designer.SelectionService.CurrentSelection.OfType<DesignerItem>();

                foreach (DesignerItem item in designerItems)
                {
                    double left = Canvas.GetLeft(item);
                    double top = Canvas.GetTop(item);

                    minLeft = double.IsNaN(left) ? 0 : Math.Min(left, minLeft);
                    minTop = double.IsNaN(top) ? 0 : Math.Min(top, minTop);
                }

                double deltaHorizontal = Math.Max(-minLeft, e.HorizontalChange);
                double deltaVertical = Math.Max(-minTop, e.VerticalChange);

                foreach (DesignerItem item in designerItems)
                {
                    double left = Canvas.GetLeft(item);
                    double top = Canvas.GetTop(item);

                    if (double.IsNaN(left)) left = 0;
                    if (double.IsNaN(top)) top = 0;

                    Canvas.SetLeft(item, left + deltaHorizontal);
                    Canvas.SetTop(item, top + deltaVertical);
                }

                designer.InvalidateMeasure();
                e.Handled = true;
            }
        }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF拖动事件 的相关文章

  • 如何检索 ComboBox 选定的值作为枚举类型?

    这是我的Enum code public enum EmployeeType Manager Worker 我将初始化ComboBox值 而表单将自身初始化为 combobox1 ItemsSource Enum GetValues typ
  • 如何更改每个 DataGrid 行详细信息的行详细信息的 DataTemplate 中的 TextBlock 的文本?

    我有 Datagrid 通过鼠标在每一行中单击显示数据网格行详细信息 这是代码 Microsoft Windows Controls DataGridRow row Microsoft Windows Controls DataGridRo
  • 在 WPF 媒体元素中连续重播视频

    我有一个在媒体元素中播放的视频文件 我需要继续播放 因此我尝试了 me play me MediaEnded new RoutedEventHandler me MediaEnded 使用此事件方法 loop to keep video p
  • 如何在不修改以前的文本的情况下更改 WPF RichTextBox 中的 FontFamily

    当您使用 RichTextBox 的 FontFamily 属性时 它会更改 FlowDocument 内整个内容的 FontFamily 就像执行 EditingCommands ToggleBold 这样的命令一样 它仅更改插入符号下的
  • 如何在 WPF 中设置窗口边框和标题栏的样式? [复制]

    这个问题在这里已经有答案了 我们正在开发一个 WPF 应用程序 它使用 Telerik 的控件套件 一切正常且看起来很好 不幸的是 我们最近需要替换所有对话框的基类 将 RadWindow 更改为标准 WPF 窗口 原因与本讨论无关 通过这
  • 在c# wpf中从Memorystream获取Imagesource

    我怎样才能得到ImageSource from MemoryStream在 WPF 中使用 C 或转换MemoryStream to ImageSource将其显示为 wpf 中的图像 using MemoryStream memorySt
  • 获取程序集中所有资源的列表

    我有一个文件夹Resources并想要获得一份包含所有内容的列表paths 如果我将它们设置为embedded resource 我可以通过 var resources Assembly GetExecutingAssembly GetMa
  • 带有移动向前/向后按钮的自定义列表框

    我有一个带有左 右重复按钮的自定义列表框 可以使用内容模板滚动其内容 如下所示
  • WPF Treeview,如何更改缩进

    我的树视图基本上有 文件夹 节点 以及不包含其他项目的项目下面的一层 因此 不需要用于展开 折叠图标的空间 在第 2 层 我可以放弃这个图标空间从而减少缩进吗 项目 在示例 机场 中 应向左移动一些像素 重要提示 基本上是寻找代码解决方案
  • 数据绑定到代码隐藏中的目标 CLR 属性

    在代码隐藏中绑定到依赖属性很容易 你只需创建一个新的System Windows Data Binding对象 然后调用目标依赖对象的SetBinding method 但是 当我们绑定的属性是 CLR 属性并且您无法提供Dependenc
  • 什么是WPF浏览器应用程序类型项目?

    什么时候应该使用 WPF 浏览器应用程序 该项目类型有什么用处 开发人员什么时候应该使用这个 WPF 浏览器应用程序是在浏览器中作为 XBAP Xaml 浏览器应用程序 运行的应用程序 您可以找到有关 XBAP 的用途和原因的更多信息her
  • WPF DataGrid 选定项

    我有一个 DataGrid 用户可以通过在最后一行输入数据来添加项目 我还有一个按钮可以删除当前选定的项目 但是 当选择最后一行 空 用于添加新项目 时 最后选定的项目将保留在 SelectedItem 中 因此 如果我打开窗口 选择最后一
  • WPF 日历控件按住鼠标

    所以我放弃了标准的 WPFCalendarVS2010 中全新 WPF 应用程序中的 MainWindow xaml 控件 如果我单击日历中的某一天 然后尝试单击应用程序的 关闭 按钮 则我必须在关闭按钮上单击两次才能接受单击 它的表现就好
  • 从 BitmapImage 获取支持的图像格式

    如何获取 System Windows Media Imaging BitmapImage 支持的图像格式列表 我正在用 C WPF 编写一个简单的图像处理工具 BitmapImage 类是更有用的位图类之一 因为它能够从多种格式进行解码
  • 在 XAML 中设置依赖项属性时,为什么会在运行时绕过 .NET 属性包装器?

    我正在阅读 Adam Nathan 的书 WPF 4 Unleashed 第 82 页有以下警告 在 XAML 中设置依赖属性时 NET 属性包装器会在运行时被绕过 虽然 XAML 编译器依赖于 编译时的属性包装器 WPF 调用底层 直接在
  • 使用 WPF 动态加载内容

    好的 我有一个容器 我为其创建了两个数据模板 基本上 一个模板将显示 5 个文本框 其中包含绑定到它们的对象数据 另一个模板将显示一个用于添加该特定对象的按钮 我对 DataTemplateSelector 进行了子类化 它可以工作 但是当
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 用于添加新实体的 MVVM WPF ViewModel

    我对 WPF 中的 MVVM 的概念是 我们为应用程序中的每个模型都有一个 ViewModel 这意味着如果我们有 Customer 类 实体 那么我们将有 CustomerViewModel CustomerViewModel 将具有代表
  • 具有自动删除项目的 WPF 列表框

    我正在尝试设置一个列表框 用户可以通过单击他们想要删除的每个值来删除项目 我为列表框设置了样式 DisplayName 是项目类的成员 以便为每个项目包含一个按钮
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach

随机推荐

  • 常见Code Review过程中发现的问题

    软件环境 Spring MVC MyBatis 主要体现在两个方面 一个是编码习惯问题 另一个是编码质量的问题 编码习惯主要有日志编写 代码注释以及编码风格的问题 而编码质量则与很多方面相关 比如轮子的使用 数据交互 逻辑精简程度等等 下面
  • jdcob--Could not initialize class com.jacob.com.ComThread

    1 dll 文件 放在tomcat bin 下面 2 dll 文件 放在c windows system32 下面 3 dll jar 文件 放在 WEB INF lib 下面
  • 服务器CPU占用过高如何解决

    1 定位出来使用资源CPU最多的进程 不管是Windows还是linux或者Mac 这个都可以通过任务管理器很快的定位出来 2 定位为什么这个进程耗费CPU资源多 通常的原因有 程序本身本身就是CPU密集型的任务 而且程序正处于工作状态 某
  • VS2019设置easyx图形库

    easyx图形库里面的graphics h头文件非常好用但是VS不能使用怎么办我了教给你设置 让在VS2019上也能愉快的使用easyx图形库 1 下载easyx图形库 我这里提供的是EasyX 2020 百度云链接 https pan b
  • Hibernate Annotation注解和关系映射

    1 Hibernate Annotation关系映射有下面几种类型 1 一对一外键关联映射 单向 2 一对一外键关联映射 双向 3 一对一主键关联映射 不重要 在这不演示 在实际中很少用 使用注解 PrimaryKeyJoinColumn
  • 浅谈游戏被唾弃的原因

    游戏为什么会被唾弃 为什么家长觉得要禁止孩子玩游戏 这是一个很值得深思的问题 今天上课时 大家正好辩论了这一点 我也想说说我的看法 欢迎大家讨论 一起为游戏行业的未来发展寻找一个方向 来自一个梦想成为游戏开发者的请求 首先 有人厌恶游戏的原
  • 到底什么是非线性规划?

    本文转自新浪博客 到底什么是非线性优化 作者 那些年的那些偏执 网址 http blog sina com cn s blog 7445c2940102x3x4 html 作者系在读博士生 文章写的非常浅显易懂 本文除转载之外 做简单修改整
  • 以半加器实现全加器

    module fulladder input wire in 1 input wire in 2 input wire cin 进位 output wire sum output wire count wire hfsum1 wire hf
  • CNN-LSTM多变量回归预测(Matlab) 基于卷积-长短期记忆网络(CNN-LSTM)的数据回归预测

    CNN LSTM多变量回归预测 Matlab 基于卷积 长短期记忆网络 CNN LSTM 的数据回归预测 1 CNN结合LSTM做拟合回归预测 数据多维输入单维输出 代码内注释详细 直接替换数据就可以使用 2 运行环境Matlab2020b
  • Android 蓝牙串口通信工具类 SeriaPortUtil 2.0.+

    原文地址 https www shanya world archives 2fd981ea html SerialPortUtil 提示 最新版本 3 0 已发布 其对比 2 0 版本 API有了很大改动 且修复了很多bug 并带来一些新的
  • jeecgboot数据权限用法

    添加数据规则 菜单管理中给需要数据权限的菜单加数据规则 Jeecg Boot 数据权限用法 编码 描述 sys user code 当前登录用户登录账号 sys user name 当前登录用户真实名称 sys date 当前系统日期 sy
  • 因果推断dowhy之-探索酒店取消预订的原因分析

    0x01 DoWhy案例分析 本案例依旧是基于微软官方开源的文档进行学习 有想更深入了解的请移步微软官网 背景 取消酒店预订可能有不同的原因 客户可能会要求一些无法提供的东西 例如 停车场 客户可能后来发现酒店没有满足他们的要求 或者客户可
  • Qt Remote Objects 简介

    QtRO是Qt RemoteObjects的简称 是从5 9开始Qt官方推出的一个用于进程间通信 IPC 的新模块 虽然该模块目前仍处于TP阶段 但已经足够稳定 由于项目开发需要 我们将一个大项目划分成了若干个子工程 各个子工程都是独立的程
  • Vue自定义指令给box添加水印

    1 创建directive js 并引入 src utils下 import Vue from vue Vue directive watermark el binding gt function addWaterMarker str pa
  • C# 接收邮件

    使用pop协议实现接收邮件 转载 C 接收邮件之QQ邮箱 c qq邮箱收邮件 Csharp 小记的博客 CSDN博客 using MailKit using MailKit Net Imap using MailKit Search usi
  • VMware Centos7下载安装教程(超详细)

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 Centos7下载安装 一 下载镜像 二 创建虚拟机 三 安装Centos 7 四 配置网络 一 下载镜像 点击进入 清华大学
  • Altium Designer:地PAD和铺铜不连接问题

    一个非典型的问题解决过程 1 发现问题 检查PCB时发现 TOP层有些GND管脚和via过孔 没有和铺地铜皮连到一起 但是有些GND pin却是正常连接铜皮的 2 网络搜索解决办法 按照网络上的办法 检查铺铜网络和管脚PIN的网络 都是GN
  • Mac OS 终端利器 iTerm2

    之前一直使用 Mac OS 自带的终端 用起来虽然有些不太方便 但总体来说还是可以接受的 是有想换个终端的想法 然后今天偶然看到一个终端利器 iTerm2 发现真的很强大 也非常的好用 按照网上配置了主题什么的 还是有些坑的 这边再记录下
  • LeetCode-Python-377. 组合总和 Ⅳ

    给定一个由正整数组成且不存在重复数字的数组 找出和为给定目标正整数的组合的个数 示例 nums 1 2 3 target 4 所有可能的组合为 1 1 1 1 1 1 2 1 2 1 1 3 2 1 1 2 2 3 1 请注意 顺序不同的序
  • WPF拖动事件

    1 定义一个Dragthumb模板