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);
        }
    }
}
相关推荐
爱吃煎蛋的小新4 小时前
WPF入门 #1 WPF布局基础
笔记·学习·c#·wpf
✎ ﹏梦醒͜ღ҉繁华落℘4 小时前
WPF学习(二)
学习·wpf
BearHan21 小时前
非常'肤浅'的理解MVVM
wpf
ou.cs1 天前
wpf 控件开发中,OnApplyTemplate 和 OnContentRendered区别
c#·.net·wpf
界面开发小八哥2 天前
界面组件DevExpress WPF中文教程:Grid - 节点(Nodes)概述
.net·wpf·界面控件·devexpress·ui开发
ou.cs2 天前
wpf 队列(Queue)在视觉树迭代查找中的作用分析
wpf
code bean2 天前
【WPF】WPF 中 `DisplayMemberPath` 与 `SelectedValuePath` 的深入理解与实战应用
windows·wpf
Magnum Lehar3 天前
wpf3d游戏引擎EditorColors.xaml实现
ui·游戏引擎·wpf
沉到海底去吧Go3 天前
【图片识别改名】如何批量识别大量图片的文字并重命名图片,基于WPF和京东OCR识别接口的实现方案
ocr·wpf·图片文字识别·图片识别重命名·图片区域识别改名·图片批量识别文字
ou.cs3 天前
wpf 解决DataGridTemplateColumn中width绑定失效问题
c#·wpf