2013-02-24 50 views
0

我有一个路径谁的数据来自LineGeometry。我还有一个创建路径时创建的TextBlock。 TextBlock的位置遵循Path的位置的正确方法是什么?绑定控件位置到另一个路径

+0

“路径的位置”究竟是什么?当存在一个LineGeometry时,我可以考虑至少三个位置,即行起点和终点,以及两者的中心。你将如何放置(或对齐)TextBlock相对于其中的一个点?你必须提供更多关于你将要实现的信息。 – Clemens 2013-02-24 09:14:00

+0

@Clemens我试图将文本块放在点的中心,我可以使用简单的数学方法。开始点和结束点可以移动/拖动到任意位置,我希望文本块随着路径端点的更新而更新。 – Bob 2013-02-24 09:35:49

回答

0

还有一堆的方式

  • 含在自定义面板的路径和TestBlock,并实施的MeasureOverride和ArrangeOverride
  • 使用一个已经存在的面板(网格,StackPanel中,等)
  • 听取LayoutUpdated的Path对象,然后使用TranslatePoint方法定位TextBlock

每种方式都有其缺点和优点,它取决于您的整个窗口布局以及路径布局如何动态变化

0

最简单的解决方案是将Path和TextBlock放入一个公共容器中,以在TextBlock上执行必要的布局。这可能是一个网格:

<Canvas> 
    <Grid> 
     <Path ... /> 
     <TextBlock Text="Label" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Grid> 
</Canvas> 

您也可以通过对实际计算结合其RenderTransform(或LayoutTransform)到Path的Geometry和使用binding converter相对路径的中心TextBlock的位置。转换器将例如将几何转换为TranslateTransform。请注意,它甚至不需要几何体为线几何体。它只是使用几何的Bounds。但是,您可以执行任何专门的计算,具体取决于几何的实际类型。

public class GeometryCenterConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var result = new TranslateTransform(); 
     var geometry = value as Geometry; 

     if (geometry != null) 
     { 
      result.X = (geometry.Bounds.Left + geometry.Bounds.Right)/2; 
      result.Y = (geometry.Bounds.Top + geometry.Bounds.Bottom)/2; 
     } 

     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

你会写这样的绑定:

<Path Name="path" ... /> 
<TextBlock Text="Label" 
    RenderTransform="{Binding Path=Data, ElementName=path, 
         Converter={StaticResource GeometryCenterConverter}}"/> 

注意上面的例子并不需要将TextBlock任何对准考虑。如果您需要将其设置为居中或者右对齐或底对齐,则可能需要更复杂的绑定(也许是MultiBinding),或者您可以将所有元素放在Canvas中,并在TextBlock上适当地设置Canvas.LeftCanvas.Top

相关问题