如何将项目置于Canvas中的某个点上?

时间:2012-12-11 07:54:54

标签: xaml canvas listbox windows-runtime

我正在使用一个ListBox,其DataTemplate包含一个Canvas。然后我绑定包含Canvas的Grid的Left / Top,将其移动到某一点。

我想让孩子网格居中于我指定的X,Y坐标,其中子网格的大小根据其内容而变化。我计划通过使用TranslateTransform将网格移动宽度的一半来实现这一目标。

我无法看到如何设置TranslateTransform,但是因为ElementName绑定在DataTemplate中不起作用。我有什么想法可以实现这个目标吗?

<ItemsControl ItemsSource="{TemplateBinding SomeCollection}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Canvas>
                <Grid x:Name="Container" 
                        Canvas.Left="{Binding X}" 
                        Canvas.Top="{Binding Y}"
                        Background="#88000000">
                    <Grid.RenderTransform>
                    <TranslateTransform X="{Binding ActualWidth, ElementName=Container, Converter={StaticResource NegativeHalfConverter}}"
                                        Y="{Binding ActualHeight, ElementName=Container, Converter={StaticResource NegativeHalfConverter}}" />
                </Grid.RenderTransform>
                <TextBlock Text="{Binding SomeValue}" FontSize="36" Foreground="White" />
            </Grid>
        </Canvas>
    </DataTemplate>
</ItemsControl.ItemTemplate>

`

3 个答案:

答案 0 :(得分:0)

我认为ElementName绑定应该在DataTemplate的名称范围内工作,但是我看到有人抱怨绑定到ActualWidth / Height属性时绑定没有正确更新。也许您可以只执行一个附加的行为,而不是进行复杂的设置,只要相关对象(您的网格)的参数或大小发生变化,它就会获取Point参数并更新Canvas.Left / Top属性。

答案 1 :(得分:0)

看起来错误不是绑定本身,而是具有一个功能,这意味着ActualWidth / ActualHeight属性不可绑定。谢谢菲利普。

为了解决这个问题,我创建了一个派生网格,其中包含一些新的依赖项属性,我在SizeChanged事件中更新它们以获得ActualWidth / Height。然后,我使用我的DataTemplate,如上所述,绑定到这些新的DP,以转换和居中我的网格点。似乎是一种享受。

答案 2 :(得分:0)

要将对象移动一半大小,可以使用2个旋转或缩放:第一个超过0.25,0.25相对点,第二个超过输入点0.5,0.5。如果你使用旋转,那么天使是180度和-180度。如果使用比例,则比例因子为-1,-1和-1,-1。 不要忘记RenderTransformOrigin属性。要应用两个转换,您可以将它们应用于两个嵌套元素。