亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于C#的wpf怎么實現Grid內控件拖動

發布時間:2021-11-20 16:41:50 來源:億速云 閱讀:275 作者:iii 欄目:開發技術

這篇文章主要介紹“基于C#的wpf怎么實現Grid內控件拖動”,在日常操作中,相信很多人在基于C#的wpf怎么實現Grid內控件拖動問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于C#的wpf怎么實現Grid內控件拖動”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    前言:

    有一些業務場景中我們需要拖動控件,在Grid中就可以實現控件拖動,通過設置Margin屬性即可,根據鼠標的移動,設置相應的MarginLeft、Top,當然有時也不是直接設置的,需要根據HorizontalAlignmentVerticalAlignment值有不同的計算方法。

    一、如何實現?

    1.注冊鼠標事件

    拖動的控件需要注冊3個鼠標事件分別是,鼠標按下、鼠標移動、鼠標彈起。

    以Button為例:

    <Button   PreviewMouseDown="Button_MouseDown" 
              PreviewMouseMove="Button_MouseMove" 
              PreviewMouseUp="Button_MouseUp"> </Button>

    2.記錄位置

    在鼠標按下事件中記錄位置。

    //鼠標是否按下
    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的方式也不同。

    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.恢復標識

    鼠標彈起后需要恢復標識,讓控件不再跟隨鼠標移動。

    private void Button_MouseUp(object sender, MouseButtonEventArgs e)
    {
     
        if (_isMouseDown)
        {
     
            _isMouseDown = false;
            //移動了的控件不響應點擊事件(此處根據具體需求)
            e.Handled = true;
        }
    }

    二、示例

    示例代碼:

    <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內控件拖動

    到此,關于“基于C#的wpf怎么實現Grid內控件拖動”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    崇文区| 五台县| 抚州市| 揭阳市| 贡觉县| 浦县| 凤城市| 贵南县| 镇远县| 南昌市| 汽车| 上犹县| 资阳市| 靖州| 赣州市| 新丰县| 富平县| 朔州市| 临汾市| 容城县| 文水县| 琼中| 石嘴山市| 延边| 福泉市| 那坡县| 革吉县| 绵竹市| 永丰县| 托克托县| 武邑县| 江孜县| 泰安市| 班玛县| 淅川县| 五寨县| 金川县| 竹北市| 乐陵市| 黎平县| 兴隆县|