代码之家  ›  专栏  ›  技术社区  ›  Stefan

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

  •  2
  • Stefan  · 技术社区  · 16 年前

    我需要一些东西来获取子元素相对于容器的位置。TransformToAncestor就是这样做的。但是,元素和子元素会移动、调整大小、更改布局等。我需要一种方法使位置保持最新。就像一个事件,如果发生任何会影响我的TransformToAncestor操作的事情。或者我可以绑定到的“AbsolutePosition”依赖属性。

    背景:

    我在做一个工作流编辑器。

    <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”属性并不存在(我在这里使用start/endpoint而不是X1、X2、Y1、Y2只是为了提高可读性)

    3 回复  |  直到 16 年前
        1
  •  3
  •   Stefan    16 年前

    然而,如果这不适用,我在谷歌搜索kek444的提示时发现了另一种方法。

    事件 UIElement.LayoutUpdated 每当布局上的某些内容发生更改时都会激发。它会对元素的移动、大小调整、添加/删除以及其他任何事情做出反应。它不仅在事件注册的元素受到影响时触发,而且在使用同一调度线程的任何其他元素受到影响时也会触发。因此,它经常被触发,因此使用它可能会对性能产生相当大的影响。

    另请参见Dave Relyea的博客。Stackoverflow不允许我发布两个链接,所以只需在google上搜索“Layout Events-SizeChanged and LayoutUpdate”。

        2
  •  2
  •   Fabrício Matté    16 年前

    如果使用附加的子元素位置依赖属性(如 Canvas 面板(根据提供的代码,情况似乎是这样),然后您可以使用 DependencyPropertyDescriptor .

    DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Canvas));
    
    dpd.AddValueChanged(canvas1, new EventHandler(topChangedCallback));
    
        3
  •  0
  •   Ashley Davis    14 年前

    我在CodeProject上写了一篇关于将数据绑定到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