0

我正在使用一个 ListBox,它的 DataTemplate 包含一个 Canvas。然后我绑定包含该画布的网格的左/上,以将其移动到某个点。

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

我看不到如何设置 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>

`

4

3 回答 3

0

I think ElementName binding should work in the name scope of a DataTemplate, but I have seen people complaining about bindings not updating correctly when binding to ActualWidth/Height properties. Perhaps instead of doing the complicated setup you have you could just implement an attached behavior that takes a Point parameter and updates the Canvas.Left/Top properties whenever the parameter or size of the associated object (your grid) changes.

于 2012-12-11T09:23:57.943 回答
0

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

于 2012-12-13T17:13:26.970 回答
0

看起来故障不在于绑定本身,而在于一个意味着 ActualWidth/ActualHeight 属性不可绑定的特性。谢谢菲利普。

为了解决这个问题,我创建了一个派生的 Grid,其中包含几个新的依赖属性,我在 SizeChanged 事件中更新这些属性以获得 ActualWidth/Height。然后,我使用上面的 DataTemplate,绑定到这些新的 DP,以将我的 Grid 翻译和居中在一个点上。似乎是一种享受。

于 2012-12-11T18:02:38.330 回答