2017-06-22 80 views
0

因此,我在WPF中創建了此窗口編輯器,該窗口編輯器可以幫助我快速創建窗體。現在,我所研究的一個功能就是創建指南工具。在它的核心,它只是創建線條來幫助保持我的UI元素在屏幕上組織。我會告訴你一個例子。漫長的黑線是我之前談到的指導方針。現在「捕捉」指南

enter image description here

,我注意到,在很多文藝節目(即Photoshop中)和實現形式流行的IDE,他們有一個「捕捉到」特徵,其中一個UI元素將捕捉到一條線UI或到另一個UI元素以保持對齊。事情是這樣的:

enter image description here

我已經有了指引顯示我的編輯了。現在,我想要幫助理解的是,我將如何執行「捕捉到」功能?我沒有要求代碼,只是一個故障(視覺故障將是最受歡迎的)。

這是我的問題:

  1. 如何對象知道,如果它的邊緣(上,下,左,右)觸及行嗎?
  2. 如果用戶不斷移動鼠標超過指南,我將如何知道如何解除UI元素的綁定?
  3. 如果我有(說)10行,我如何確保對象連接到最近的行?

UPDATE

enter image description here

+2

當對象移動或調整大小時,請跟蹤其相對於鼠標的實際大小/位置,並分別跟蹤相同信息的快照版本。如果給定的實際邊緣在一行的任意距離內 - 比如說4個像素(真的是WPF單位)。如果它在該距離內,則將其設置爲它接近的線的值。您仍然擁有* actual *鼠標相對值,因此如果用戶不斷拖動它並且離開該4單元區域,您就知道要將其取消。找到對齊線很容易 - 再次使用'%'。 –

+0

當用戶拖動對象並且對象的邊緣靠近線條時(例如10像素或更少或20像素等),將其對齊(即 - 立即移動到線條上)當用戶拖動對象時 - 不要移動它直到達到相同的距離,然後立即將它移出到那個距離(unsnap)。 – Evk

+1

@ Ed Plunkett YYour邏輯是有聲的!我實現了它,它的工作原理!非常感謝! – user3838697

回答

1

當物體移動或調整大小,記錄其實際相對於鼠標尺寸/位置的,並分別保持相同的捕獲的版本軌道信息。如果給定的實際邊緣在一行的任意距離內 - 比如說4個像素(真的是WPF單位)。如果它在該距離內,則將其設置爲它接近的線的值。您仍然具有實際的鼠標相對值,因此如果用戶一直拖動它並且離開該4單元區域,則知道要將其取消。

當一個對象被調整大小時,邊界框的最多兩個邊將會改變位置(假設您可以拖動邊角以及邊)。當您移動物體時,邊界框的所有四個邊都會移動。

因此,您需要跟蹤哪些邊緣正在移動,並且只對這些邊緣進行咬合線接近測試。當你移動一個物體時,將左邊或者頂邊捕捉到一條線很容易。這只是對象的位置。但是,如果你捕捉到一條線的右側或頂部邊緣,你設置

snappedPos.X = nearestVerticalSnapLine.X - draggedObject.Width; 

snappedPos.Y = nearestHorizontalSnapLine.Y - draggedObject.Height; 

您還可能有情況相對邊緣都將是接近臺詞:你說正在將十個單位的正方形拖到十個單位的網格上。當它位於網格框內時,所有四條邊將接近網格線。哪個勝利?更近的一個。

定位捕捉線很容易 - %

+0

最後一件事:我該如何測試如果UI對象觸及頂部或底部的水平線?並再次感謝第一個答案,這有助於很多! – user3838697

+0

很高興爲您提供幫助。您是什麼意思,「頂部或底部水平線」?您的意思是物體的底部是觸摸下面的線,還是頂部觸摸上面的線? –

+0

正確,比方說我的物體的底部正在觸摸頂部線,然後我想將它錨定到底部。我希望我可以附加圖像 – user3838697