[英]Bind to element's position relative to a parent in WPF
我需要一些東西來獲得子子元素相對於容器的位置。 TransformToAncestor做到了。 但是,元素和子元素會移動,調整大小,更改其布局等。我需要一種方法來保持位置最新。 就像發生任何會影響我的TransformToAncestor操作的事件一樣。 或我可以綁定的“ AbsolutePosition”依賴項屬性。
背景:
我正在做某種工作流程編輯器。 有些“模塊”具有一個或多個端口,並且線路將端口之間的模塊連接起來。
XAML結構如下所示:
<Canvas>
<Module Left="..." Top="..." Width="..." Height="...">
<Grid><otherelement><somemorelayouting>
<Port Name="a" />
<Port Name="b" />
</somemorelayouting></otherelement></Grid>
</Module>
<Module Left="..." Top="..." Width="..." Height="...">
<differentsetoflayouts>
<Port Name="c" />
<Port Name="d" />
</differentsetoflayouts>
</Module>
<Line startpoint="{binding source=a, path=abs_position}" endpoint="{binding source=c, path=abs_position}" />
</Canvas>
該線路將第一個模塊的端口a與第二個模塊的端口b連接起來。 端點應位於端口元素的左上角(當前)。 不幸的是,此示例中使用的“ abs_position”屬性確實不存在(我在此處使用起始點/端點代替X1,X2,Y1,Y2是為了提高可讀性)
我建議,如果可能的話,請使用帶有自定義布局的kek444解決方案。 但是,如果這不適用,這是我在搜索kek444的提示時發現的另一種方法。
每當布局上的某些內容發生更改時,都會觸發事件UIElement.LayoutUpdated 。 它對元素的移動,調整大小,添加/刪除元素以及其他任何事情都起反應。 它不但會影響在其上注冊事件的元素,而且還會觸摸到使用同一分派線程的其他任何元素。 因此,它經常被觸發,因此使用它可能會對性能產生一定的影響。
另請參閱Dave Relyea的博客條目。 Stackoverflow不允許我發布兩個鏈接,所以只用Google搜索“布局事件-SizeChanged和LayoutUpdated”。
如果使用附加的依賴項屬性實現容器的子元素位置(如Canvas面板那樣,根據提供的代碼,情況似乎如此),則可以使用DependencyPropertyDescriptor綁定到該依賴項屬性的更改。
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Canvas));
dpd.AddValueChanged(canvas1, new EventHandler(topChangedCallback));
我在代碼項目上寫了一篇有關將數據綁定到UI元素位置的文章:
http://www.codeproject.com/Articles/139216/A-Simple-Technique-for-Data-binding-to-the-Positio
您的工作流編輯器聽起來也可能類似於我稱為NetworkView的圖形和圖表控件:
http://www.codeproject.com/Articles/182683/NetworkView-A-WPF-custom-control-for-visualizing-a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.