国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

WPF-利用裝飾器實(shí)現(xiàn)控件的自由拖動(dòng)

這篇具有很好參考價(jià)值的文章主要介紹了WPF-利用裝飾器實(shí)現(xiàn)控件的自由拖動(dòng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

  在項(xiàng)目中經(jīng)常會(huì)遇到類(lèi)似如下要求的需求,創(chuàng)建允許自由拖動(dòng)的控件,這樣的需求可以使用WPF的裝飾器Adorner來(lái)實(shí)現(xiàn)。

WPF-利用裝飾器實(shí)現(xiàn)控件的自由拖動(dòng)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-671021.html

一、什么是裝飾器?

裝飾器是一種特殊類(lèi)型的FrameworkElement,裝飾器始終呈現(xiàn)在被裝飾元素的頂部,用于向用戶(hù)提供可視化提示。裝飾器可以在不改變?cè)锌丶Y(jié)構(gòu)的基礎(chǔ)上,將功能點(diǎn)增加到元素中或元素上提供視覺(jué)效果等,如WPF的光標(biāo)效果,焦點(diǎn)效果等都是通過(guò)裝飾器來(lái)實(shí)現(xiàn)的。
裝飾器是一個(gè)始終位于裝飾元素或裝飾元素集合頂部的呈現(xiàn)圖層,其呈現(xiàn)獨(dú)立與它所綁定的UIElement,WPF中的裝飾器是在一個(gè)單獨(dú)的曾AnornerLayer上進(jìn)行繪制的,該層位于普通控件元素之上,而且允許多個(gè)AdornerLayer進(jìn)行疊加,當(dāng)加入AdornerLayer層后,Adorner會(huì)默認(rèn)使用其所裝飾元素的左上角作為原點(diǎn)進(jìn)行定位。
  • Adorner 是一個(gè)抽象類(lèi),所有裝飾器的實(shí)現(xiàn)都需要繼承此類(lèi),比如ThumbBorderAdorner
  • AdornerLayer 一個(gè)類(lèi),表示一個(gè)或多個(gè)裝飾元素的裝飾器呈現(xiàn)層
    • 利用AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(userControl)函數(shù),來(lái)獲取指定控件是否有裝飾器布局層
    • 利用Adorner[] adorners = adornerLayer.GetAdorners(userControl);,來(lái)查看當(dāng)前控件的裝飾器個(gè)數(shù)
  • AdornerDecorator 一個(gè)類(lèi),為可視化樹(shù)中的子元素提供AdornerLayer
WPF-利用裝飾器實(shí)現(xiàn)控件的自由拖動(dòng)

二、裝飾器的使用場(chǎng)景

  • 為現(xiàn)有的元素添加額外的裝飾,如為Border添加8個(gè)裝飾矩形
?

三、如何創(chuàng)建自定義的裝飾器?

  • 創(chuàng)建一個(gè)類(lèi),繼承自Adorner類(lèi)
  • 重寫(xiě)此類(lèi)中需要的函數(shù)
    • OnRender(DrawingContext drawingContext) 在派生類(lèi)中重寫(xiě),參與由布局系統(tǒng)控制的呈現(xiàn)操作,調(diào)用此方法時(shí),不直接使用此元素的呈現(xiàn)指令,而是將其保留供布局和繪制在以后異步使用,可以使用drawingContext 來(lái)繪制各種形狀以及圖形。
    • ArrangeOverride() 為FrameworkElement派生類(lèi)定位子元素并確定大小,在其中調(diào)用Arrange()函數(shù),來(lái)定位子元素
    • GetVisualChild() //獲取第幾個(gè)Thumb控件,在構(gòu)造時(shí)使用
  • 簡(jiǎn)單的裝飾可以重寫(xiě)OnRender()函數(shù),在其中繪制所需要的裝飾,參照BorderAdorner
  • 復(fù)雜一些的如需要可以定義VisualCollection的集合來(lái)存放裝飾器,重寫(xiě)ArrangeOverride和GetVisualChild函數(shù)來(lái)實(shí)現(xiàn),參照ThumbBorderAdorner
?

四、給控件使用自定義的Adorner

  • 添加Adorner
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(userControl);
if (adornerLayer != null)
{
    Adorner[] adorners = adornerLayer.GetAdorners(userControl);
    if (adorners == null || adorners.Count() == 0)
    {
        adornerLayer.Add(new ThumbBorderAdorner(userControl)
        {
            DragCompletedAction = ThumbBorderAdornerDragCompletedActionFunc
        });
    }
}

?

  • 移除 Adorner
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(userControl);
if (adornerLayer != null)
{
    Adorner[] adorners = adornerLayer.GetAdorners(userControl);
    if (adorners != null && adorners.Count() > 0)
        adornerLayer.Remove(adorners[0]);
}

?

五、處理拖拽Thumb時(shí),導(dǎo)致控件范圍超出父級(jí)容器的情況

  • 即在添加裝飾器的控件中添加UserControl_SizeChanged()來(lái)處理控件大小和和未知變化
private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
    int tempMargin = 1;  //MarkRectUserControl控件始終在父級(jí)容器的1個(gè)像素以?xún)?nèi)

    double left = Canvas.GetLeft(this);
    if (left < tempMargin)
    {
        left = tempMargin;
        Canvas.SetLeft(this, left);
    }

    double top = Canvas.GetTop(this);
    if (top < tempMargin)
    {
        top = tempMargin;
        Canvas.SetTop(this, top);
    }

    if (left + this.ActualWidth > canvasParent.ActualWidth - tempMargin)
        this.Width = canvasParent.ActualWidth - tempMargin - left;

    if (top + this.ActualHeight > canvasParent.ActualHeight - tempMargin)
        this.Height = canvasParent.ActualHeight - tempMargin - top;

}

?

六、測(cè)試使用

?

<UserControl x:Class="BlogDemo.Views.AdornerTestUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:BlogDemo.Views"
             mc:Ignorable="d" 
             Background="White"
             d:DesignHeight="450" d:DesignWidth="800"
             FontSize="20"
             Foreground="Blue"
             Loaded="UserControl_Loaded"
             >
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        
        <TextBlock Text="請(qǐng)拖拽Thumb控件來(lái)改變,控件大小。" HorizontalAlignment="Center" Margin="10"/>

        <Canvas x:Name="Canvas_Main" Grid.Row="1">
            <Border x:Name="Border_Text" Canvas.Left="200" Canvas.Top="100" Width="200" Height="100" BorderThickness="2" BorderBrush="Green" SizeChanged="Border_Text_SizeChanged"/>
        </Canvas>
    </Grid>
</UserControl>
/// <summary>
/// AdornerTestUserControl.xaml 的交互邏輯
/// </summary>
public partial class AdornerTestUserControl : UserControl
{
    public AdornerTestUserControl()
    {
        InitializeComponent();
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(Border_Text);
        if (adornerLayer != null)
        {
            Adorner[] adorners = adornerLayer.GetAdorners(Border_Text);
            if (adorners == null || adorners.Count() == 0)
            {
                adornerLayer.Add(new ThumbBorderAdorner(Border_Text));
            }
        }
    }

    private void Border_Text_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        int tempMargin = 100; 

        double left = Canvas.GetLeft(Border_Text);
        if (left < tempMargin)
        {
            left = tempMargin;
            Canvas.SetLeft(Border_Text, left);
        }

        double top = Canvas.GetTop(Border_Text);
        if (top < tempMargin)
        {
            top = tempMargin;
            Canvas.SetTop(Border_Text, top);
        }

        if (Border_Text.ActualWidth < tempMargin)
            Border_Text.Width = tempMargin;

        if (Border_Text.ActualHeight < tempMargin)
            Border_Text.Height = tempMargin;

        if (left + Border_Text.ActualWidth > Canvas_Main.ActualWidth - tempMargin)
            Border_Text.Width = Canvas_Main.ActualWidth - tempMargin - left;

        if (top + Border_Text.ActualHeight > Canvas_Main.ActualHeight - tempMargin)
            Border_Text.Height = Canvas_Main.ActualHeight - tempMargin - top;
    }
}

?

?

源碼地址:https://gitee.com/LiuShuiRuoBing/code_blog

?

?

到了這里,關(guān)于WPF-利用裝飾器實(shí)現(xiàn)控件的自由拖動(dòng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#在winForm窗體中添加一個(gè)可以自由拖動(dòng)的控件

    C#在winForm窗體中添加一個(gè)可以自由拖動(dòng)的控件

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 目錄 文章目錄 一、實(shí)現(xiàn)步驟 1.創(chuàng)建一個(gè)新的Windows窗體項(xiàng)目 2.添加控件如圖 3.代碼部分 總結(jié) textBox1=鼠標(biāo)在需要拖動(dòng)的控件中的坐標(biāo) X 值 textBox2=鼠標(biāo)在需要拖動(dòng)的控件中的坐標(biāo) Y 值 textBox3=需要

    2024年01月19日
    瀏覽(33)
  • 淺談WPF之控件拖拽與拖動(dòng)

    淺談WPF之控件拖拽與拖動(dòng)

    使用過(guò)office的visio軟件畫(huà)圖的小伙伴都知道,畫(huà)圖軟件分為兩部分,左側(cè)圖形庫(kù),存放各種圖標(biāo),右側(cè)是一個(gè)畫(huà)布,將左側(cè)圖形庫(kù)的圖標(biāo)控件拖拽到右側(cè)畫(huà)布,就會(huì)生成一個(gè)新的控件,并且可以自由拖動(dòng)。那如何在WPF程序中,實(shí)現(xiàn)類(lèi)似的功能呢?今天就以一個(gè)簡(jiǎn)單的小例子,

    2024年02月05日
    瀏覽(19)
  • vue/Element UI 實(shí)現(xiàn)Element UI el-dialog 自由拖動(dòng)

    vue/Element UI 實(shí)現(xiàn)Element UI el-dialog 自由拖動(dòng)

    前言: 最近有個(gè)項(xiàng)目,客戶(hù)要求彈窗可拖動(dòng),但是由于elemen ui本身的彈窗并沒(méi)有拖動(dòng)的屬性,無(wú)法滿(mǎn)足客戶(hù)的需求。 于是我百度找到了幾篇文章,終于可以實(shí)現(xiàn)客戶(hù)的需求! 請(qǐng)往下看↓↓ 一、新建一個(gè)目錄:utils 二、創(chuàng)建drag .js文件 三、創(chuàng)建directive.js 文件 四、main.js文件中

    2024年02月02日
    瀏覽(33)
  • Flutter 實(shí)現(xiàn)任意控件拖動(dòng)

    Flutter 實(shí)現(xiàn)任意控件拖動(dòng)

    使用flutter開(kāi)發(fā)是需要控件能拖動(dòng),比如畫(huà)板中的元素,或者工具條,搜索框,每個(gè)都單獨(dú)去實(shí)現(xiàn)拖動(dòng)還是比較麻煩的,將拖動(dòng)功能封裝成一個(gè)控件,需要的時(shí)候直接使用拖動(dòng)控件作為父控件這樣就方便很多了。 使用translate變換位置即可 這一步不是必須的,但是如果需要限制

    2024年02月15日
    瀏覽(34)
  • 利用colab實(shí)現(xiàn)AI繪畫(huà)自由

    利用colab實(shí)現(xiàn)AI繪畫(huà)自由

    最近AIGC真的很火,除了chatGPT外,AI繪畫(huà)也是熱度不減。最近也是決定抽空上手嘗試一下,但奈何我的本本太渣,丐版Mac跑跑數(shù)據(jù)還行,跑Stable Diffusion根本沒(méi)戲。所以還是決定白嫖谷歌的colab。 網(wǎng)上關(guān)于本地部署的教程很多,最火的例如b站的秋葉大神,mac版的也不少,可自行

    2024年02月09日
    瀏覽(17)
  • Android:RecyclerView自由拖動(dòng)item

    原生就自帶有可拖動(dòng)item的工具:ItemTouchHelper 看下效果: 可拖動(dòng)RecyclerView預(yù)覽效果 接下來(lái)我們看如何使用。 其中判斷條件中的item.isMovable這邊是記錄該item是否可以拖動(dòng),也可以換成其他判斷條件比如根據(jù)位置判斷等。 另外,需要留意一點(diǎn),如果你是在onBindViewHolder中有設(shè)置點(diǎn)

    2024年01月23日
    瀏覽(22)
  • Mkdocs中利用Js實(shí)現(xiàn)大小圈鼠標(biāo)拖動(dòng)樣式

    Mkdocs中利用Js實(shí)現(xiàn)大小圈鼠標(biāo)拖動(dòng)樣式

    在 docs/javascripts/extra.js 下復(fù)制粘貼: 其中比較重要的參數(shù)就是鼠標(biāo)的尺寸和顏色,已經(jīng)在上圖中標(biāo)出,目前發(fā)現(xiàn)顏色只支持RGB寫(xiě)法和固有名稱(chēng)寫(xiě)法(例如red這種),其他參數(shù)也可以自行摸索: 在docs/stylesheets/extra.css添加如下代碼: 這里比較重要的參數(shù)就是鼠標(biāo)跟隨的圓形顏

    2024年02月15日
    瀏覽(21)
  • WPF 實(shí)現(xiàn) Message 消息提醒控件

    WPF 實(shí)現(xiàn) Message 消息提醒控件 控 件:Message 作 者:WPFDevelopersOrg - 驚鏵 原文鏈接:https://github.com/WPFDevelopersOrg/WPFDevelopers 框架使用 .NET4 至 .NET6 ; Visual Studio 2022 ; 接著上一篇 1)新增 MessageListBoxItem.cs 代碼如下: 新增了名為 MessageType 的依賴(lài)屬性,類(lèi)型為 MessageBoxImage ,默認(rèn)值為

    2024年02月16日
    瀏覽(24)
  • WPF 組態(tài)軟件實(shí)現(xiàn)思路(WPF控件可視化布局)

    WPF 組態(tài)軟件實(shí)現(xiàn)思路(WPF控件可視化布局)

    一、實(shí)現(xiàn)控件選中及自由拖動(dòng) 二、實(shí)現(xiàn)控件對(duì)齊功能 三、實(shí)現(xiàn)對(duì)齊輔助線(xiàn)功能 四、實(shí)現(xiàn)框選功能 GitHub地址點(diǎn)此 屬性編輯控件基于Devexpress V21.2.3 控件庫(kù),如需編譯需購(gòu)買(mǎi)及安裝 Devexpress V21.2.3 開(kāi)發(fā)庫(kù) 腳本編輯基于AvalonEdit開(kāi)源庫(kù) https://github.com/icsharpcode/AvalonEdit 圖標(biāo)控件基于

    2024年02月04日
    瀏覽(66)
  • WPF實(shí)現(xiàn)html中的table控件

    WPF實(shí)現(xiàn)html中的table控件

    前言 相信很多做WPF開(kāi)發(fā)的小伙伴都遇到過(guò)表格類(lèi)的需求,雖然現(xiàn)有的Grid控件也能實(shí)現(xiàn),但是使用起來(lái)的體驗(yàn)感并不好,比如要實(shí)現(xiàn)一個(gè)Excel中的表格效果,估計(jì)你能想到的第一個(gè)方法就是套Border控件,用這種方法你需要控制每個(gè)Border的邊框,并且在一堆Bordr中找到Grid.Row,G

    2024年03月26日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包