簡體   English   中英

綁定到元素相對於WPF中父元素的位置

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM