在设计WPF或Silverlight应用程序的UI部分时,我们可以对视觉元素应用一些显示转换(LayoutTransform
或RenderTransform
)。其中一些转变是:
我想知道使用这种转换在多大程度上减慢了渲染页面的速度?
更具体一点。例如,我在页面上有一千个简单元素,比如矩形,使用网格和一些StackPanel放入行中。如果我对其中的全部或部分应用RotateTransform
,是否会对我的应用程序的性能产生显着影响?
当然,我可以尝试看看会发生什么,但也许有一些我根本不知道的事情。
答案 0 :(得分:1)
以下是您可以用来试验各种选项的原型:
<Grid>
<Grid.Resources>
<local:Range x:Key="sampleData" Minimum="1" Maximum="900"/>
</Grid.Resources>
<ItemsControl ItemsSource="{StaticResource sampleData}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="30" Columns="30"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" FontSize="8">
<TextBlock.LayoutTransform>
<RotateTransform Angle="30"/>
</TextBlock.LayoutTransform>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
和数据生成器:
class Range : List<int>, ISupportInitialize
{
public int Minimum { get; set; }
public int Maximum { get; set; }
public void BeginInit() { }
public void EndInit()
{
for (int i = Minimum; i <= Maximum; i++) Add(i);
}
}
左上角看起来像这样:
您可以通过调整窗口大小来触发布局,在我的机器上它有点迟钝但可用。然后,您可以测试其他容器,其他变换,布局与渲染变换等,以查看它们之间的差异。
答案 1 :(得分:1)
LayoutTranform将导致布局系统完全通过。这将导致重新测量和重新排列所有屏幕上的对象。这是一个数学密集型操作,与屏幕上对象的数量成比例。
如果这不是您所需要的,那么使用RenderTransform会更快,因为它不会导致完整的布局传递。使用one over other的影响将取决于屏幕上显示其他对象的情况以及转换需要应用于哪些对象。