服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 基于C# wpf 实现Grid内控件拖动详情

基于C# wpf 实现Grid内控件拖动详情

2022-12-09 12:24Alfred-N C#

这篇文章主要介绍了基于C# wpf 实现Grid内控件拖动,有一些业务场景中我们需要拖动控件,在Grid中就可以实现控件拖动,通过设置Margin属性即可,下面文章我们来看看具体的实现内容

前言:

有一些业务场景中我们需要拖动控件,在Grid中就可以实现控件拖动,通过设置Margin属性即可,根据鼠标的移动,设置相应的MarginLeft、Top,当然有时也不是直接设置的,需要根据HorizontalAlignmentVerticalAlignment值有不同的计算方法。

一、如何实现?

1.注册鼠标事件

拖动的控件需要注册3个鼠标事件分别是,鼠标按下、鼠标移动、鼠标弹起。

以Button为例:

?
1
2
3
<Button   PreviewMouseDown="Button_MouseDown"
          PreviewMouseMove="Button_MouseMove"
          PreviewMouseUp="Button_MouseUp"> </Button>

2.记录位置

在鼠标按下事件中记录位置。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//鼠标是否按下
bool _isMouseDown = false;
//鼠标按下的位置
Point _mouseDownPosition;
//鼠标按下控件的Margin
Thickness _mouseDownMargin;
//鼠标按下事件
private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
 
    var c = sender as Control;
    _isMouseDown = true;
    _mouseDownPosition = e.GetPosition(this);
    _mouseDownMargin = c.Margin;
}

3.跟随鼠标移动

鼠标按下后移动鼠标,控件需要跟随鼠标移动。根据HorizontalAlignmentVerticalAlignment值不同,计算Margin的方式也不同。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private void Button_MouseMove(object sender, MouseEventArgs e)
{
 
    if (_isMouseDown)
    {
 
        var c = sender as Control;
        var pos = e.GetPosition(this);
        var dp = pos - _mouseDownPosition;
        double left, top, right, bottom;
        if (c.HorizontalAlignment == HorizontalAlignment.Stretch|| c.HorizontalAlignment == HorizontalAlignment.Center)
        //中央移动距离是双倍
        {
 
            left= _mouseDownMargin.Left+ dp.X * 2;
            right = _mouseDownMargin.Right;
        }
        else if(c.HorizontalAlignment== HorizontalAlignment.Left)
        //左边是正常距离
        {
 
            left = _mouseDownMargin.Left + dp.X ;
            right = _mouseDownMargin.Right;
        }
        else
        //右边是右边距距离
        {
 
            left = _mouseDownMargin.Left;
            right = _mouseDownMargin.Right - dp.X;
        }
        if (c.VerticalAlignment == VerticalAlignment.Stretch || c.VerticalAlignment == VerticalAlignment.Center)
        //中央移动距离是双倍
        {
 
            top = _mouseDownMargin.Top+ dp.Y* 2;
            bottom = _mouseDownMargin.Bottom;
        }
        else if (c.VerticalAlignment == VerticalAlignment.Top)
        //顶部是正常距离
        {
 
            top = _mouseDownMargin.Top + dp.Y ;
            bottom = _mouseDownMargin.Bottom;
        }
        else
        //底部是底边距距离
        {
 
            top = _mouseDownMargin.Top ;
            bottom = _mouseDownMargin.Bottom- dp.Y;
        }
        c.Margin = new Thickness(left, top, right, bottom);
    }
}

4.恢复标识

鼠标弹起后需要恢复标识,让控件不再跟随鼠标移动。

?
1
2
3
4
5
6
7
8
9
10
11
private void Button_MouseUp(object sender, MouseButtonEventArgs e)
{
 
    if (_isMouseDown)
    {
 
        _isMouseDown = false;
        //移动了的控件不响应点击事件(此处根据具体需求)
        e.Handled = true;
    }
}

二、示例

示例代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
<Window x:Class="WpfControlMove.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:WpfControlMove"
        mc:Ignorable="d"
        Title="MainWindow" Height="360" Width="640">
    <Grid>
        <Button Width="120" Height="50" Content="移动"   PreviewMouseDown="Button_MouseDown" PreviewMouseMove="Button_MouseMove" PreviewMouseUp="Button_MouseUp"> </Button>
    </Grid>
</Window>

效果预览:

基于C# wpf 实现Grid内控件拖动详情

总结:

本文说明了Grid中控件拖动的方法。方法采用了记录鼠标位置以及控件位置的方法来确保准确的相对位置。如果是采用只记录鼠标位置,计算时通过控件内部坐标差值累加,这样会产生累计误差,除非取整运算,但取整与dpi有可能产生不兼容。总的来说,本方法采用准确的位置计算方式,而且还根据不同停靠采用相应的计算方法,适用性较好。

到此这篇关于基于C# wpf 实现Grid内控件拖动详情的文章就介绍到这了,更多相关C# wpf 实现Grid内控件拖动内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/u013113678/article/details/121366556

延伸 · 阅读

精彩推荐
  • C#C#中String和StringBuilder的简介与区别

    C#中String和StringBuilder的简介与区别

    今天小编就为大家分享一篇关于C#中String和StringBuilder的简介与区别,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随...

    Czhenya6292022-03-03
  • C#C#在Excel表格中插入、编辑和删除批注

    C#在Excel表格中插入、编辑和删除批注

    这篇文章主要为大家详细介绍了C#如何在Excel表格中插入、编辑和删除批注,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    E-iceblue6182022-02-24
  • C#Datagridview使用技巧(9)Datagridview的右键菜单

    Datagridview使用技巧(9)Datagridview的右键菜单

    这篇文章主要为大家详细介绍了Datagridview使用技巧,Datagridview的右键菜单,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    .NET开发菜鸟3902022-01-04
  • C#C# 当前系统时间获取及时间格式详解

    C# 当前系统时间获取及时间格式详解

    这篇文章主要介绍了C# 当前系统时间获取及时间格式详解的相关资料,这里提供代码实例,帮助大家学习参考,需要的朋友可以参考下...

    C#教程网4922021-12-14
  • C#C#实现简易猜数字游戏

    C#实现简易猜数字游戏

    这篇文章主要为大家详细介绍了C#实现简易猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    飘散的枫叶9382022-02-22
  • C#Unity3D实现旋钮控制灯光效果

    Unity3D实现旋钮控制灯光效果

    这篇文章主要为大家详细介绍了Unity3D实现旋钮控制灯光效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    蓝染s3892022-07-19
  • C#C#基于WebBrowser获取cookie的实现方法

    C#基于WebBrowser获取cookie的实现方法

    这篇文章主要介绍了C#基于WebBrowser获取cookie的实现方法,实例分析了C#基于WebBrowser简单读取浏览谷歌网站cookie的相关技巧,非常简单实用,需要的朋友可以参考...

    宁静.致远5852021-11-02
  • C#C# 利用Selenium实现浏览器自动化操作的示例代码

    C# 利用Selenium实现浏览器自动化操作的示例代码

    这篇文章主要介绍了C# 利用Selenium实现浏览器自动化操作,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...

    Alan.hsiang12042022-10-09