绑定到元素相对于WPF中父级的位置

时间:2009-07-26 18:18:23

标签: c# .net 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。端点应位于port-element的左上角(目前)。这个例子中使用的“abs_position”属性不存在(我在这里使用start / endpoint而不是X1,X2,Y1,Y2只是为了提高可读性)

3 个答案:

答案 0 :(得分:3)

我建议尽可能使用自定义布局的kek444解决方案。 但是,如果这不适用,这是我在搜索kek444的提示时发现的另一个approch。

只要布局上的某些内容发生变化,就会触发事件UIElement.LayoutUpdated。它会对移动,调整大小,添加/删除元素以及任何其他内容做出反应。它不仅会在元素受到影响时触发事件的注册,还会触及使用相同调度线程的任何其他元素。因此,它经常被解雇,因此使用它可能会对性能产生很大影响。

另见Dave Relyea的博客文章。 Stackoverflow不允许我发布两个链接,所以只需谷歌“布局事件 - SizeChanged和LayoutUpdated”。

答案 1 :(得分:2)

如果为子元素的位置实现具有附加依赖项属性的容器(如Canvas面板所做的那样,根据提供的代码似乎就是这种情况),那么您可以绑定到该依赖项属性的更改使用DependencyPropertyDescriptor

DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Canvas));

dpd.AddValueChanged(canvas1, new EventHandler(topChangedCallback));

答案 2 :(得分:0)

我写了一篇关于数据绑定到UI元素位置的代码项目的文章:

http://www.codeproject.com/Articles/139216/A-Simple-Technique-for-Data-binding-to-the-Positio

您的工作流编辑器听起来也像我的图形和图表控件NetView一样:

http://www.codeproject.com/Articles/182683/NetworkView-A-WPF-custom-control-for-visualizing-a

相关问题