我在嵌套的silverlight控件中使用CompositeTransforms,并看到意外的结果。
以下是XAML的简化示例:
<Grid x:Name="ContainerControl" RenderTransformOrigin="0,0">
<Grid.RenderTransform>
<CompositeTransform Rotation="{Binding Rotation}"/>
</Grid.RenderTransform>
<Rectangle Width="50" Height="50" Fill="RoyalBlue" DataContext="{Binding Child}">
<Rectangle.RenderTransform>
<CompositeTransform TranslateX="{Binding XTranslation}" TranslateY="{Binding YTranslation}"/>
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
使用非常简单的对象:
public class TestData
{
public decimal Rotation { get { return 90; } }
public TestChild Child { get { return new TestChild(); } }
}
public class TestChild
{
public decimal XTranslation { get { return 20; } }
public decimal YTranslation { get { return 30; } }
}
我假设子对象(矩形)将应用其平移变换,然后父对象(网格)将旋转整个对象。然而,这并不是我所看到的。嵌套转换的执行顺序是什么?我怎么能轻易地强迫它按我期望的方式工作呢?
在进一步研究中,我已经确认绑定在层次结构中自上而下得到了解决。也就是说,父绑定在子绑定之前得到解析。我通过在绑定代码中放置断点来看到这一点,并查看最先命中的是哪一个。
然而,我已经意识到绑定解析和渲染步骤是分开的。绑定以错误的顺序出现并不意味着呈现以意外的方式发生。
我已经追踪到我的具体问题与其他事情有关。尽管如此,我还是希望这个例子能展示一些有用的行为。