您好,登錄后才能下訂單哦!
這篇文章主要介紹“基于C#的wpf怎么實現Grid內控件拖動”,在日常操作中,相信很多人在基于C#的wpf怎么實現Grid內控件拖動問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于C#的wpf怎么實現Grid內控件拖動”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
前言:
有一些業務場景中我們需要拖動控件,在Grid
中就可以實現控件拖動,通過設置Margin
屬性即可,根據鼠標的移動,設置相應的Margin
的Left
、Top,當然有時也不是直接設置的,需要根據HorizontalAlignment
、VerticalAlignment
值有不同的計算方法。
拖動的控件需要注冊3個鼠標事件分別是,鼠標按下、鼠標移動、鼠標彈起。
以Button為例:
<Button PreviewMouseDown="Button_MouseDown" PreviewMouseMove="Button_MouseMove" PreviewMouseUp="Button_MouseUp"> </Button>
在鼠標按下事件中記錄位置。
//鼠標是否按下 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; }
鼠標按下后移動鼠標,控件需要跟隨鼠標移動。根據HorizontalAlignment
、VerticalAlignment
值不同,計算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); } }
鼠標彈起后需要恢復標識,讓控件不再跟隨鼠標移動。
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內控件拖動”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。