将变换应用于WPF中的所有子元素

时间:2015-04-25 18:07:57

标签: c# .net wpf

我正在我的应用程序中实现行为,它将根据屏幕大小调整主要内容区域的大小。 (内容区域由图标和用户可以放置/绘制的其他元素组成)

目前,margin属性用于使用将Point转换为Thickness的转换器来定位元素。

示例:

http://i.imgur.com/tom7ZKE.png

“缩放”是我的目标,其中子元素按位置“缩放”到容器的大小。

如何将变换(RenderTransformLayoutTransform)应用于网格的所有元素,以便图标位置将缩放到正确的位置,具体取决于网格尺寸?

还应该注意,在应用程序运行时可以删除/添加这些图标。元素的位置是所有需要缩放的,的大小。

1 个答案:

答案 0 :(得分:2)

我之前已经这样做了,我建议你这样做:

  1. 在您的元素类(例如,Circle)中,您有某种坐标表示其位置,按比例表示容器的大小。因此,0.5代表中间,0.33代表左边三分之一等。
  2. 创建一个IMultiValueConverter,根据给定维度的相对坐标和容器大小计算像素坐标;
  3. 使用其边距(如果是Grid容器)或Canvas.Top/Left(如果是Canvas容器)以下列方式声明XAML中的对象:
  4. 的Xaml:

    <Circle>
        <Circle.Margin>
            <MultiBinding Converter="{StaticResource ThatConverter}">
                <Binding ElementName="container" Path="ActualWidth"/>
                <Binding Path="CircleCoordinateX"/>
                <!-- The same for height and Y coordinate -->
            </MultiBinding>
        </Circle.Margin>
    </Circle>
    

    而不是这种更简单的方法,理想情况下,您应该使容器成为ItemsControl,为数据类型ItemsTemplate创建Circle,并将容器ItemsSource绑定到例如,在某些视图模型上有一些ObservableCollection。