WPF实现拖动控件功能(类似从工具箱拖出工具)

一、背景

下面代码只是简单示例,未使用MVVM模式编写

二、工具箱(ListBox)

2.1 前端代码

复制代码
<!-- 工具箱 -->
<ListBox Grid.Column="0" x:Name="Toolbox">
    <ListBoxItem>Tool 1</ListBoxItem>
    <ListBoxItem>Tool 2</ListBoxItem>
    <!-- 添加更多工具 -->
</ListBox>

2.2 前端事件

复制代码
<Window.Resources>
    <Style TargetType="ListBoxItem">
        <EventSetter Event="PreviewMouseMove" Handler="ListBoxItem_PreviewMouseMove"/>
    </Style>
</Window.Resources>

2.2 后端拖动代码

cs 复制代码
private void ListBoxItem_PreviewMouseMove(object sender, MouseEventArgs e)
{
    if(sender is ListBoxItem item)
    {
        DragDrop.DoDragDrop(item, item.Content, DragDropEffects.Copy);
    }        
}

三、工作页面(Canvas)

3.1 前端代码

cs 复制代码
<!-- 流程图容器 -->
<Canvas Grid.Column="1" x:Name="FlowChartCanvas" Background="White" AllowDrop="True" PreviewDragOver="FlowChartCanvas_PreviewDragOver" PreviewDrop="FlowChartCanvas_PreviewDrop">
    <!-- 流程图元素 -->
</Canvas>

3.2 后端获取工具放置坐标

cs 复制代码
private Point startPoint;


private void FlowChartCanvas_PreviewDragOver(object sender, DragEventArgs e)
{
        startPoint = e.GetPosition(FlowChartCanvas);        
}

3.3 后端放置工具

cs 复制代码
private void FlowChartCanvas_PreviewDrop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.StringFormat))
    {
        var tool = e.Data.GetData(DataFormats.StringFormat) as string;
        if (tool != null)
        {
            var element = new TextBlock
            {
                Text = tool,
                Background = Brushes.LightBlue,
                Width = 100,
                Height = 30
            };
            Canvas.SetLeft(element, startPoint.X);
            Canvas.SetTop(element, startPoint.Y);
            FlowChartCanvas.Children.Add(element);
        }
    }
}
相关推荐
蜗牛互联网20 小时前
OLMo-core 3的token gerrymandering提醒:MoE路由要按时间窗验收
java·人工智能·wpf
LateFrames1 天前
WPF 升级选型:用 .NET 8 还是 .NET 10
.net·wpf·.net8·.net10
samble1 天前
从零搭建灌装监控系统(十):生产追溯,条码触发自动记录
c#·wpf·mvvm·modbus·工业控制
SamChan904 天前
PDF页面旋转与CropBox陷阱:译文回填位置总是错位的根因实测
python·ai·pdf·wpf
SamChan905 天前
PDF翻译时页眉页脚总在捣乱?跨页重复文本块的检测与过滤实测
人工智能·python·ai·pdf·wpf
samble12 天前
从零搭建灌装监控系统(四):深色主题与样式系统,ResourceDictionary 统一管理
c#·wpf·mvvm·样式·工业控制
_Jonas12 天前
.net framework开发环境正式环境配置文件的切换
.net·wpf
dalong1014 天前
WPF:Modbus 状态监控
wpf·modbus
He BianGu14 天前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
fogota17 天前
Emoji与Segoe MDL2 Assets的比较
c#·wpf