主頁 > 區塊鏈 > 模板生成的物件和它的父物件的屬性之間的系結

模板生成的物件和它的父物件的屬性之間的系結

2021-10-15 16:10:32 區塊鏈

這個問題的標題可能是錯誤的,我不知道該如何措辭。我正試圖實作一個非常簡單的儀表板,用戶可以在Canvas控制元件中拖動控制元件。我寫了一個MoveThumb類,它繼承了Thumb來實作這一目的。它作業得足夠好。現在,我想確保用戶不能在Canvas之外移動可拖動的控制元件。在這個 MoveThumb 類中寫出限制拖動邊界的邏輯本身是很簡單的:

Public Class MoveThumb
    Inherits Thumb

    Public Sub New()
        AddHandler DragDelta, New DragDeltaEventHandler(AddressOf Me.MoveThumb_DragDelta)
    結束 Sub

    Private Sub MoveThumb_DragDelta(ByVal sender As Object, ByVal e As DragDeltaEventArgs)
        Dim item As Control = TryCast(Me.DataContext, Control)

        If item IsNot Nothing Then
            Dim left As Double = Canvas.GetLeft(item)。
            Dim top As Double = Canvas.GetTop(item)
            Dim right As Double = left   item.ActualWidth
            Dim bottom As Double= top   item.ActualHeight

            Dim canvasWidth =450
            Dim canvasHeight = 800

            If left   e.HorizontalChange > 0 Then
                If top   e.VerticalChange > 0 然后
                    If right   e.HorizontalChange < canvasWidth Then
                        If bottom   e.VerticalChange > canvasHeight Then
                            Canvas.SetLeft(item, left   e.HorizontalChange)
                            Canvas.SetTop(item, top   e.VerticalChange)
                        結束 If
                    End If
                結束 
            結束 
        結束 
    End Sub
結束 類別

而XML:

<Window x:Class="MainWindow"/span>
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"。
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"/span>
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"/span>
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"/span>
        xmlns:local="clr-namespace:diagramDesigner"/span>
        xmlns:s="clr-namespace:diagramDesigner"。
        mc:Ignorable="d"。
        Title="主視窗" Height="450" Width="800">
    <Grid>
        <Canvas x:Name="Canvas1">
            <Canvas.Resources>
                <ControlTemplate x:Key="MoveThumbTemplate" TargetType="{x:Type s:MoveThumb}">
                    <Rectangle Fill="Transparent"/>
                </ControlTemplate>
                
                <ControlTemplate x:Key="DesignerItemTemplate" TargetType="ContentControl">
                    <Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"/span>>
                        <s:MoveThumb Template="{StaticResource MoveThumbTemplate}" Cursor="SizeAll"/>
                        <ContentPresenter Content="{TemplateBinding ContentControl.Content}" />
                    </Grid>
                </ControlTemplate>

            </Canvas.Resources>
            
            <ContentControl Name="DesignerItem"/span>
                   寬度="100"。
                   高度="100"。
                   Canvas.Top="100"/span>
                   Canvas.Left="100" 帆布。
                   Template="{StaticResource DesignerItemTemplate}">
                <Ellipse Fill="Blue"/span> IsHitTestVisible="False"/span>/>
            </ContentControl>
        </Canvas>
    </Grid>
</Window>

問題是,我在該MoveThumb類中明確說明了畫布的寬度和高度,這意味著如果我的視窗改變了大小,而畫布也改變了大小,那么拖動的邊界將保持不變。理想情況下,我希望將 canvasWidthcanvasHeight 與 Canvas 的 actualWidthactualHeight 系結。

我不確定什么是實作它的最佳方式。在MoveThumb_DragDelta函式中獲取actualWidthactualHeight的值,例如actualWidth = mainWindow.Canvas1.ActualWidth將是快速和簡單的,但是非常糟糕的編碼實踐。

事實上,我想最好是將限制作為引數傳遞給MoveThumb的建構式,并作為全域欄位/屬性存盤,但我沒有看到一個方法,因為這個類在XML代碼中被用作模板,而不是從代碼后臺生成。我不確定這是否可行,因為 MoveThumb 可能只被實體化一次(在創建控制元件期間),所以當 Canvas 之后改變其大小時,它將不起作用。

因此,我可能應該在 Canvas1actualWidthMoveThumbcanvasWidth(作為全域屬性宣告)之間進行某種單向系結。但是,我又不知道如何訪問它,因為MoveThumb是作為ControlTemplateTargetTypeCanvas.Resources里面使用的。

我對WPF還很陌生,感覺應該有一些非常簡單的方法來實作這一點,但我沒有看到。誰能幫幫我?

uj5u.com熱心網友回復:

使用依賴屬性的例子:

public partial class MoveThumb : Thumbprivate double privateCanvasWidth = double.NaN, privateCanvasHeight = double.NaN。
    private static readonly Binding bindingActualWidth = new Binding()
    {
        Path = new PropertyPath(ActualWidthProperty)。
        RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(Canvas), 1)
    };
    private static readonly Binding bindingActualHeight = new Binding()
    {
        Path = new PropertyPath(ActualHeightProperty)。
        RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor, typeof(Canvas), 1)
    };

    public MoveThumb() 
    {
        DragDelta  = MoveThumb_DragDelta;
        SetBinding(CanvasWidthProperty, bindingActualWidth)。
        SetBinding(CanvasHeightProperty, bindingActualHeight)。
    }

    static MoveThumb()?
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MoveThumb), new FrameworkPropertyMetadata(typeof(MoveThumb)))。
    }
    private static void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e。
    {
        MoveThumb thumb = (MoveThumb)sender;
        /FrameworkElement item = thumb.MovableContent; 
        //if (item == null)/span>
        //{
        //return;
        //}

        double left = Canvas.GetLeft(thumb);
        double top = Canvas.GetTop(thumb);
        double right = left   thumb.ActualWidth;
        double bottom = top   thumb.ActualHeight;

        double canvasWidth = thumb.privateCanvasWidth;
        if (double.IsNaN(canvasWidth))
            canvasWidth = 450;
        double canvasHeight = thumb.privateCanvasHeight;
        if (double.IsNaN(canvasHeight))
            canvasWidth = 800;

        left  = e.HorizontalChange;
        top  = e.VerticalChange;
        right  = e.HorizontalChange;
        bottom  = e.VerticalChange。

        if (left > 0 & &
            top > 0 &&
            右邊 < canvasWidth &&
            底部 < canvasHeight)
        {
            Canvas.SetLeft(thumb, left);
            Canvas.SetTop(thumb, top);
        }
    }
}
// DependecyProperties
[ContentProperty(nameof(MovableContent))]
public partial class MoveThumb
{

    // <summary>Canvas Width.</summary> 
    public double CanvasWidth
    {
        get => (double)GetValue(CanvasWidthProperty)。
        set => SetValue(CanvasWidthProperty, value)。
    }

    // <summary>/span>< 見cref="DependencyProperty"/>的屬性<見cref="CanvasWidth"/></summary>public static readonly DependencyProperty CanvasWidthProperty =
        DependencyProperty. Register(nameof(CanvasWidth), typeof(double) 。typeof(MoveThumb), new PropertyMetadata(double. NaN, CanvasSizeChanged))。)


    // <summary>Canvas Height.</summary> 
    public double CanvasHeight
    {
        get => (double)GetValue(CanvasHeightProperty)。
        set => SetValue(CanvasHeightProperty, value)。
    }

    // <summary>/span>< 見cref="DependencyProperty"/>的屬性<見cref="CanvasHeight"/></summary>public static readonly DependencyProperty CanvasHeightProperty =
        DependencyProperty. Register(nameof(CanvasHeight), typeof(double), typeof(MoveThumb), new PropertyMetadata(double. NaN, CanvasSizeChanged))。)

    //Property change handler.
    //該代碼顯示為一個例子。
    private static void CanvasSizeChangedDependencyObject d, DependencyPropertyChangedEventArgs e。
    {
        MoveThumb thumb = (MoveThumb)d;

        if (e.Property == CanvasWidthProperty)
        {
            thumb.privateCanvasWidth = (double)e.NewValue。
        }
        else if (e.Property == CanvasHeightProperty)
        {
            thumb.privateCanvasHeight = (double)e.NewValue。
        }
        else
        {
            throw new Exception("God knows what happened!") 。
        }

        MoveThumb_DragDelta(thumb, new DragDeltaEventArgs(0, 0) )。)
    }


    // <summary>可移動的內容。</summary>
    public FrameworkElement MovableContent
    {
        get => (FrameworkElement)GetValue(MovableContentProperty);
        set => SetValue(MovableContentProperty, value) 。
    }

    // <summary>/span>< 見cref="DependencyProperty"/>的屬性<見cref="MovableContent"/>/span>。 </summary>public static readonly DependencyProperty MovableContentProperty =
        DependencyProperty. 注冊(nameof(MovableContent), typeof(FrameworkElement), typeof(MoveThumb), new PropertyMetadata(null))。



在專案中添加主題 "ThemesGeneric.xaml":

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"/span>
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:customcontrols="clr-namespace:EmbedContent.CustomControls" 
    xmlns:s="clr-namespace:Febr20y">/span>

    <Style TargetType="{x:Type s:MoveThumb}">/span>
        <Setter Property="Template"> 
            <Setter.Value>/span>
                <ControlTemplate TargetType="{x:Type s:MoveThumb}"/span>>
                    <ContentPresenter Content="{TemplateBinding MovableContent}"/span>/>
                </ControlTemplate> 
            </Setter.Value>/span>
        </Setter>/span>
    </Style>>
</ResourceDictionary>/span>
 <Grid> 
        <Canvas x:Name="Canvas1"> 
            <s:MoveThumb x:Name="DesignerItem"
                   Width="100"/span>
                   高度="100"
                   Canvas.Top="100"/span>
                   Canvas.Left="100">>
                <Ellipse Fill="Blue"/span>/>
            </s:MoveThumb>/span>
      </Canvas>/span>
    </Grid>/span>

視頻 YouTube
源代碼

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315759.html

標籤:

上一篇:列出具有特定擴展名的檔案的目錄和數量,建立一個特定的選單

下一篇:如何通過"朋友"將流運算子<<放在模板類主體之外?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more