最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

一、如何實現(xiàn)

1.定義附加屬性

定義2個附加屬性,IsDragMoveable和DragMoveTarget,這兩個屬性沒有關(guān)系是分開使用的。IsDragMoveable用來標(biāo)識一個控件自身是否可以拖動。DragMoveTarget用于指明以本控件為拖動點,需要拖動的控件(比如點擊標(biāo)題欄可以拖動窗口,點擊窗口其他地方并不會拖動)。

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),以本控件為拖動點,需要拖動的目標(biāo)。使用場景比如標(biāo)題欄拖動的是整個窗口
  /// </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個鼠標(biāo)事件,所以將它們整合到一起還是比較容易的。具體代碼可參考前面四章的內(nèi)容。

整合的方法有很多種比如使用Switch的方式:

private void MouseDown(object sender, MouseButtonEventArgs e)
{
    switch (moveType)
    case MoveType.Grid://Grid內(nèi)控件鼠標(biāo)按下邏輯,參考《C# wpf 實現(xiàn)Grid內(nèi)控件拖動》
        break;
    case MoveType.Canvas://Canvas內(nèi)控件鼠標(biāo)按下邏輯,參考《C# wpf 實現(xiàn)Canvas內(nèi)控件拖動)
        break;
    case MoveType.Window://Window鼠標(biāo)按下邏輯,參考《c# wpf 實現(xiàn)窗口任意區(qū)域點擊拖動)
        break;
    case MoveType.Others://其他控件鼠標(biāo)按下邏輯,參考《C# wpf 實現(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個鼠標(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)整個窗口拖動

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

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

效果預(yù)覽1:

總結(jié)

總得來說將拖動功能封裝成一共附加屬性是很有用的。首先是具有通用性,在不同的窗口以及不同的項目中都可以使用,同時也減少了代碼維護量,修改時只需要集中改一出即可,然后使用方法也是比較簡單直接。

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

相關(guān)文章

  • C#開發(fā)WPF程序中的弱事件模式

    C#開發(fā)WPF程序中的弱事件模式

    這篇文章介紹了C#開發(fā)WPF程序中的弱事件模式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#利用iTextSharp添加PDF水印

    C#利用iTextSharp添加PDF水印

    這篇文章主要為大家詳細(xì)介紹了C#利用iTextSharp添加PDF水印的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C#實現(xiàn)根據(jù)數(shù)字序號輸出星期幾的簡單實例

    C#實現(xiàn)根據(jù)數(shù)字序號輸出星期幾的簡單實例

    這篇文章主要介紹了C#實現(xiàn)根據(jù)數(shù)字序號輸出星期幾的簡單實例,代碼簡潔實用,也有助于初學(xué)者更好的理解C#的switch和if語句的流程控制,需要的朋友可以參考下
    2014-07-07
  • C# datatable 不能通過已刪除的行訪問該行的信息處理方法

    C# datatable 不能通過已刪除的行訪問該行的信息處理方法

    采用datatable.Rows[i].Delete()刪除行后再訪問該表時出現(xiàn)出現(xiàn)“不能通過已刪除的行訪問該行的信息”的錯誤
    2012-11-11
  • C#實現(xiàn)倒計時關(guān)閉提示框功能

    C#實現(xiàn)倒計時關(guān)閉提示框功能

    最近小編接到一個功能需要實現(xiàn)一個提示框并且能自動關(guān)閉的,看到這個需求真是懵了,四處搜集資料才搞定,接下來通過本文給大家分享C#實現(xiàn)倒計時關(guān)閉提示框功能,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • C#網(wǎng)站生成靜態(tài)頁面的實例講解

    C#網(wǎng)站生成靜態(tài)頁面的實例講解

    今天小編就為大家分享一篇關(guān)于C#網(wǎng)站生成靜態(tài)頁面的實例講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C#之日期格式轉(zhuǎn)換過程

    C#之日期格式轉(zhuǎn)換過程

    本文詳細(xì)介紹了DateTime轉(zhuǎn)字符串(ToString)及字符串轉(zhuǎn)DateTime(Parse/ParseExact/TryryuserParse/Try Pornhub在2本文詳細(xì)介紹了如何使用DateTime的ToString和Parse/ParseExact/Try總結(jié)了DateTime轉(zhuǎn)換方法,幫助開發(fā)者更高效地處理日期時間數(shù)據(jù)
    2026-05-05
  • C#?實例解釋面向?qū)ο缶幊讨械膯我还δ茉瓌t(示例代碼)

    C#?實例解釋面向?qū)ο缶幊讨械膯我还δ茉瓌t(示例代碼)

    本文我介紹了?SOLID?原則中的單一功能原則(single-responsibility?principle),并通過?C#?代碼示例簡明地詮釋了它的含意和實現(xiàn),對C#?面向?qū)ο缶幊淘瓌t感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • C#中Guid類使用小結(jié)

    C#中Guid類使用小結(jié)

    本文主要介紹了C#中Guid類用于生成和操作 128 位的唯一標(biāo)識符,用于數(shù)據(jù)庫主鍵及分布式系統(tǒng),支持通過NewGuid、Parse等方法生成,感興趣的可以了解一下
    2025-07-07
  • C# WinForm實現(xiàn)自動更新程序之客戶端的示例代碼

    C# WinForm實現(xiàn)自動更新程序之客戶端的示例代碼

    這篇文章主要為大家詳細(xì)介紹了利用C# WinForm實現(xiàn)自動更新程序之客戶端的實現(xiàn)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-10-10

最新評論

喜德县| 渑池县| 郴州市| 晋城| 安溪县| 武陟县| 苍山县| 佛教| 定远县| 团风县| 新津县| 九江县| 建阳市| 游戏| 抚远县| 呼伦贝尔市| 武威市| 承德市| 含山县| 城步| 南木林县| 黄骅市| 丹江口市| 抚顺县| 藁城市| 平原县| 柯坪县| 九江市| 田东县| 晋江市| 隆化县| 灯塔市| 都昌县| 襄樊市| 神农架林区| 延边| 兴国县| 雷波县| 西畴县| 镇巴县| 大厂|