欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#?wpf利用附加屬性實(shí)現(xiàn)任意控件拖動(dòng)

 更新時(shí)間:2023年11月08日 08:30:08   作者:CodeOfCC  
這篇文章主要為大家詳細(xì)介紹了C#?WPF如何利用附加屬性對(duì)幾種拖動(dòng)方式進(jìn)行封裝,實(shí)現(xiàn)復(fù)用性,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

前面幾章講了控件拖動(dòng)的幾種方法,根據(jù)不同的布局可以有不同的拖動(dòng)方式。本章主要講的是利用附加屬性對(duì)幾種拖動(dòng)方式進(jìn)行封裝,實(shí)現(xiàn)復(fù)用性,否則直接注冊(cè)事件的方式在同界面多個(gè)控件中是幾乎沒(méi)有復(fù)用性的,實(shí)現(xiàn)起來(lái)很不方便。通過(guò)將上述幾章的所有功能整合到附加屬性中,增加靈活度和適用性。

一、如何實(shí)現(xiàn)

1.定義附加屬性

定義2個(gè)附加屬性,IsDragMoveable和DragMoveTarget,這兩個(gè)屬性沒(méi)有關(guān)系是分開(kāi)使用的。IsDragMoveable用來(lái)標(biāo)識(shí)一個(gè)控件自身是否可以拖動(dòng)。DragMoveTarget用于指明以本控件為拖動(dòng)點(diǎn),需要拖動(dòng)的控件(比如點(diǎn)擊標(biāo)題欄可以拖動(dòng)窗口,點(diǎn)擊窗口其他地方并不會(huì)拖動(dòng))。

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>
 /// 控件是否能拖動(dòng)
 /// </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>
  /// 拖動(dòng)目標(biāo),以本控件為拖動(dòng)點(diǎn),需要拖動(dòng)的目標(biāo)。使用場(chǎng)景比如標(biāo)題欄拖動(dòng)的是整個(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的各種控件拖動(dòng)方法,都使用了相同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)控件拖動(dòng)》
        break;
    case MoveType.Canvas://Canvas內(nèi)控件鼠標(biāo)按下邏輯,參考《C# wpf 實(shí)現(xiàn)Canvas內(nèi)控件拖動(dòng))
        break;
    case MoveType.Window://Window鼠標(biāo)按下邏輯,參考《c# wpf 實(shí)現(xiàn)窗口任意區(qū)域點(diǎn)擊拖動(dòng))
        break;
    case MoveType.Others://其他控件鼠標(biāo)按下邏輯,參考《C# wpf 實(shí)現(xiàn)任意控件拖動(dòng)》
        break;
    }
}
private void MouseMove(object sender, MouseEventArgs e)
{
    // 類(lèi)似上面switch,略
}
private void MouseUp(object sender, MouseEventArgs e)
    {
    //類(lèi)似上面switch,略
}

3.關(guān)聯(lián)功能

在附加屬性的改變事件中關(guān)聯(lián)拖動(dòng)代碼,判斷不同的控件并注冊(cè)事件。

public void PropertyChangedCallback(Dependency0bject d, DependencyPropertyChangedEventArgs e)
{
    // 1.判斷控件類(lèi)型
    // 2.注冊(cè)3個(gè)鼠標(biāo)事件
}

二、使用示例

1.拖動(dòng)控件

(1)、Grid內(nèi)控件拖動(dòng)
代碼:

<Grid>
    <Button local:CommonTools.IsDragMoveable="True" Width="120" Height="50"  Content="移動(dòng)"/>
</Grid>

(2)、Canvas內(nèi)控件拖動(dòng)

<Canvas>
    <Button local:CommonTools.IsDragMoveable="True" Width="120" Height="50"  Content="移動(dòng)"/>
</Canvas>

(3)、其他任意控件拖動(dòng)

<StackPanel>
    <Button local:CommonTools.IsDragMoveable="True" Width="120" Height="50"  Content="移動(dòng)"/>
</StackPanel>

效果預(yù)覽,上面3中情況預(yù)覽效果是一樣的。

2.拖動(dòng)窗口

(1)通過(guò)按鈕拖動(dòng)窗口

標(biāo)簽其他無(wú)相關(guān)屬性略

<Window  Name="window" >
    <Grid>
        <Button local:CommonTools.DragMoveTarget="{Binding ElementName=window}"  Width="120" Height="50" Content="拖動(dòng)窗口" ></Button> 
    </Grid>
</Window>

效果預(yù)覽:

(2)整個(gè)窗口拖動(dòng)

標(biāo)簽其他無(wú)相關(guān)屬性略

<Window local:CommonTools.IsDragMoveable="True">

效果預(yù)覽1:

總結(jié)

總得來(lái)說(shuō)將拖動(dòng)功能封裝成一共附加屬性是很有用的。首先是具有通用性,在不同的窗口以及不同的項(xiàng)目中都可以使用,同時(shí)也減少了代碼維護(hù)量,修改時(shí)只需要集中改一出即可,然后使用方法也是比較簡(jiǎn)單直接。

到此這篇關(guān)于C# wpf利用附加屬性實(shí)現(xiàn)任意控件拖動(dòng)的文章就介紹到這了,更多相關(guān)C# wpf控件拖動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Unity3D動(dòng)態(tài)對(duì)象優(yōu)化代碼分享

    Unity3D動(dòng)態(tài)對(duì)象優(yōu)化代碼分享

    這篇文章主要介紹了Unity3D動(dòng)態(tài)對(duì)象優(yōu)化代碼分享的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • 理解C#中的Lambda表達(dá)式

    理解C#中的Lambda表達(dá)式

    這篇文章主要介紹了理解C#中的Lambda表達(dá)式,本文用實(shí)例代碼來(lái)講解Lambda表達(dá)式,用不同的角度總結(jié)對(duì)它的認(rèn)識(shí),需要的朋友可以參考下
    2015-04-04
  • C#實(shí)現(xiàn)坦克大戰(zhàn)游戲

    C#實(shí)現(xiàn)坦克大戰(zhàn)游戲

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C#連接MySQL操作詳細(xì)教程

    C#連接MySQL操作詳細(xì)教程

    這篇文章主要為大家詳細(xì)介紹了C#連接MySQL操作詳細(xì)教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • WPF綁定實(shí)例詳解

    WPF綁定實(shí)例詳解

    這篇文章主要介紹了WPF綁定的用法,包括了WPF綁定控件及非控件對(duì)象的用法,以及各類(lèi)參數(shù)的詳細(xì)用法,需要的朋友可以參考下
    2014-09-09
  • C#微信開(kāi)發(fā)之發(fā)送模板消息

    C#微信開(kāi)發(fā)之發(fā)送模板消息

    這篇文章主要為大家詳細(xì)介紹了C#微信開(kāi)發(fā)之發(fā)送模板消息的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C#中基數(shù)排序算法的原理及實(shí)現(xiàn)

    C#中基數(shù)排序算法的原理及實(shí)現(xiàn)

    基數(shù)排序算法是一種非比較式的排序方法,通過(guò)分配和收集步驟對(duì)數(shù)字的每一位進(jìn)行排序,學(xué)習(xí)基數(shù)排序有助于提高排序效率,解決特定問(wèn)題,廣泛應(yīng)用于多個(gè)領(lǐng)域如數(shù)據(jù)分析和數(shù)據(jù)庫(kù)索引建立等
    2024-10-10
  • WPF字體或內(nèi)容模糊的解決方法

    WPF字體或內(nèi)容模糊的解決方法

    WPF下開(kāi)發(fā)的程序字體模糊,這個(gè)問(wèn)題或許大家都有遇到過(guò),為了解決WPF字體模糊,查閱了各種資料,結(jié)果偶然發(fā)現(xiàn)是自己疏忽了一些細(xì)節(jié)造成的,具體是什么細(xì)節(jié)呢,通過(guò)下面的這篇文章來(lái)一起看看吧,有需要的朋友們可以參考借鑒。
    2016-12-12
  • C#自定義控件實(shí)現(xiàn)TextBox禁止粘貼的方法

    C#自定義控件實(shí)現(xiàn)TextBox禁止粘貼的方法

    這篇文章主要介紹了C#自定義控件實(shí)現(xiàn)TextBox禁止粘貼的方法,結(jié)合具體實(shí)例形式分析了C#自定義控件的創(chuàng)建、使用方法及TextBox禁止粘貼的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • .NET/C# 使用Stopwatch測(cè)量運(yùn)行時(shí)間

    .NET/C# 使用Stopwatch測(cè)量運(yùn)行時(shí)間

    這篇文章主要介紹了.NET/C# 使用Stopwatch測(cè)量運(yùn)行時(shí)間,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01

最新評(píng)論