C#?wpf利用附加屬性實(shí)現(xiàn)任意控件拖動
前言
前面幾章講了控件拖動的幾種方法,根據(jù)不同的布局可以有不同的拖動方式。本章主要講的是利用附加屬性對幾種拖動方式進(jìn)行封裝,實(shí)現(xiàn)復(fù)用性,否則直接注冊事件的方式在同界面多個(gè)控件中是幾乎沒有復(fù)用性的,實(shí)現(xiàn)起來很不方便。通過將上述幾章的所有功能整合到附加屬性中,增加靈活度和適用性。
一、如何實(shí)現(xiàn)
1.定義附加屬性
定義2個(gè)附加屬性,IsDragMoveable和DragMoveTarget,這兩個(gè)屬性沒有關(guān)系是分開使用的。IsDragMoveable用來標(biāo)識一個(gè)控件自身是否可以拖動。DragMoveTarget用于指明以本控件為拖動點(diǎn),需要拖動的控件(比如點(diǎn)擊標(biāo)題欄可以拖動窗口,點(diǎn)擊窗口其他地方并不會拖動)。
IsDragMoveable:
public static bool GetIsDragMoveable(DependencyObject obj) { return (bool)obj.GetValue(IsDragMoveableProperty); } public static void SetIsDragMoveable(DependencyObject obj, bool value) { obj.SetValue(IsDragMoveableProperty, value); } /// <summary> /// 控件是否能拖動 /// </summary> // Using a DependencyProperty as the backing store for IsDragMoveable. This enables animation, styling, binding, etc... public static readonly DependencyProperty IsDragMoveableProperty = DependencyProperty.RegisterAttached("IsDragMoveable", typeof(bool), typeof(Move), new PropertyMetadata(false));
DragMoveTarget:
public static Control GetDragMoveTarget(DependencyObject obj) { return (Control)obj.GetValue(DragMoveTargetProperty); } public static void SetDragMoveTarget(DependencyObject obj, Control value) { obj.SetValue(DragMoveTargetProperty, value); } /// <summary> /// 拖動目標(biāo),以本控件為拖動點(diǎn),需要拖動的目標(biāo)。使用場景比如標(biāo)題欄拖動的是整個(gè)窗口 /// </summary> // Using a DependencyProperty as the backing store for DragMoveTarget. This enables animation, styling, binding, etc... public static readonly DependencyProperty DragMoveTargetProperty = DependencyProperty.RegisterAttached("DragMoveTarget", typeof(Control), typeof(Move), new PropertyMetadata(null));
2.整合功能
系列文章中的前四章節(jié)都是講述wpf的各種控件拖動方法,都使用了相同3個(gè)鼠標(biāo)事件,所以將它們整合到一起還是比較容易的。具體代碼可參考前面四章的內(nèi)容。
整合的方法有很多種比如使用Switch的方式:
private void MouseDown(object sender, MouseButtonEventArgs e) { switch (moveType) case MoveType.Grid://Grid內(nèi)控件鼠標(biāo)按下邏輯,參考《C# wpf 實(shí)現(xiàn)Grid內(nèi)控件拖動》 break; case MoveType.Canvas://Canvas內(nèi)控件鼠標(biāo)按下邏輯,參考《C# wpf 實(shí)現(xiàn)Canvas內(nèi)控件拖動) break; case MoveType.Window://Window鼠標(biāo)按下邏輯,參考《c# wpf 實(shí)現(xiàn)窗口任意區(qū)域點(diǎn)擊拖動) break; case MoveType.Others://其他控件鼠標(biāo)按下邏輯,參考《C# wpf 實(shí)現(xiàn)任意控件拖動》 break; } } private void MouseMove(object sender, MouseEventArgs e) { // 類似上面switch,略 } private void MouseUp(object sender, MouseEventArgs e) { //類似上面switch,略 }
3.關(guān)聯(lián)功能
在附加屬性的改變事件中關(guān)聯(lián)拖動代碼,判斷不同的控件并注冊事件。
public void PropertyChangedCallback(Dependency0bject d, DependencyPropertyChangedEventArgs e) { // 1.判斷控件類型 // 2.注冊3個(gè)鼠標(biāo)事件 }
二、使用示例
1.拖動控件
(1)、Grid內(nèi)控件拖動
代碼:
<Grid> <Button local:CommonTools.IsDragMoveable="True" Width="120" Height="50" Content="移動"/> </Grid>
(2)、Canvas內(nèi)控件拖動
<Canvas> <Button local:CommonTools.IsDragMoveable="True" Width="120" Height="50" Content="移動"/> </Canvas>
(3)、其他任意控件拖動
<StackPanel> <Button local:CommonTools.IsDragMoveable="True" Width="120" Height="50" Content="移動"/> </StackPanel>
效果預(yù)覽,上面3中情況預(yù)覽效果是一樣的。
2.拖動窗口
(1)通過按鈕拖動窗口
標(biāo)簽其他無相關(guān)屬性略
<Window Name="window" > <Grid> <Button local:CommonTools.DragMoveTarget="{Binding ElementName=window}" Width="120" Height="50" Content="拖動窗口" ></Button> </Grid> </Window>
效果預(yù)覽:
(2)整個(gè)窗口拖動
標(biāo)簽其他無相關(guān)屬性略
<Window local:CommonTools.IsDragMoveable="True">
效果預(yù)覽1:
總結(jié)
總得來說將拖動功能封裝成一共附加屬性是很有用的。首先是具有通用性,在不同的窗口以及不同的項(xiàng)目中都可以使用,同時(shí)也減少了代碼維護(hù)量,修改時(shí)只需要集中改一出即可,然后使用方法也是比較簡單直接。
到此這篇關(guān)于C# wpf利用附加屬性實(shí)現(xiàn)任意控件拖動的文章就介紹到這了,更多相關(guān)C# wpf控件拖動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中基數(shù)排序算法的原理及實(shí)現(xiàn)
基數(shù)排序算法是一種非比較式的排序方法,通過分配和收集步驟對數(shù)字的每一位進(jìn)行排序,學(xué)習(xí)基數(shù)排序有助于提高排序效率,解決特定問題,廣泛應(yīng)用于多個(gè)領(lǐng)域如數(shù)據(jù)分析和數(shù)據(jù)庫索引建立等2024-10-10C#自定義控件實(shí)現(xiàn)TextBox禁止粘貼的方法
這篇文章主要介紹了C#自定義控件實(shí)現(xiàn)TextBox禁止粘貼的方法,結(jié)合具體實(shí)例形式分析了C#自定義控件的創(chuàng)建、使用方法及TextBox禁止粘貼的實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06.NET/C# 使用Stopwatch測量運(yùn)行時(shí)間
這篇文章主要介紹了.NET/C# 使用Stopwatch測量運(yùn)行時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01