与 Firefox 和 Internet Explorer 相比,Chrome Silverlight 的渲染速度非常慢(估计慢了 10 倍)。您可以简单地使用以下示例代码对此进行测试。示例代码演示了在数据网格内呈现 15000 个随机数据。
你有什么意见为什么会发生这种情况?我想到了两个猜测。
- 谷歌不希望微软的 Silverlight 在他们的平台上获得广泛的使用。
- Chrome 的基础架构以某种方式导致插件渲染缓慢。
XAML 部分:
<UserControl x:Class="sample.view.MemberView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:viewmodel="clr-namespace:sample.ViewModel"
mc:Ignorable="d"
>
<UserControl.Resources>
<viewmodel:MemberViewModel x:Key="viewModel"/>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" VerticalAlignment="Stretch" DataContext="{Binding Source={StaticResource viewModel}}">
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition Height="35"></RowDefinition>
</Grid.RowDefinitions>
<data:DataGrid BorderThickness="1" ItemsSource="{Binding Members}" VirtualizingStackPanel.VirtualizationMode="Recycling">
<data:DataGrid.Columns>
<data:DataGridTextColumn Header="Name" Width="3*" Binding="{Binding FirstName}"/>
<data:DataGridTextColumn Header="Surname" Width="3*" Binding="{Binding LastName}"/>
<data:DataGridTextColumn Header="GSM" Width="3*" Binding="{Binding MobilePhone}"/>
<data:DataGridTextColumn Header="Email" Width="3*" Binding="{Binding Email}"/>
<data:DataGridTextColumn Header="BirthDate" Width="2*" Binding="{Binding BirthDate}}"/>
</data:DataGrid.Columns>
</data:DataGrid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="1">
<Button Content="Get Random Data" Width="120" Height="25" Margin="5" Command="{Binding GetRandomDataCommand}"/>
</StackPanel>
</Grid>
</UserControl>
C#部分:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Net;
using System.Text;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace sample.ViewModel
{
public class MemberModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string MobilePhone { get; set; }
public string Email { get; set; }
public DateTime BirthDate { get; set; }
}
public class MemberViewModel
{
private List<MemberModel> _members;
public List<MemberModel> Members
{
get
{
return _members;
}
set
{
_members = value;
RaisePropertyChanged(new PropertyChangedEventArgs("Members"));
}
}
public MyCommand GetRandomDataCommand { get; set; }
public MemberViewModel()
{
GetRandomDataCommand = new MyCommand();
}
}
public class MyCommand : ICommand
{
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
private static Random random = new Random();
public void Execute(object parameter)
{
List<MemberModel> members = new List<MemberModel>();
for (int i = 0; i < 15000; ++i)
{
MemberModel m = new MemberModel();
m.FirstName = GetRandomString(random.Next(5) + 4);
m.LastName = GetRandomString(random.Next(5) + 4);
m.Email = GetRandomString(random.Next(10) + 4);
m.MobilePhone = GetRandomString(random.Next(12));
m.BirthDate = DateTime.Now.AddYears(-random.Next(50) - 18).AddMonths(random.Next(12)).AddDays(random.Next(30));
members.Add(m);
}
}
private string GetRandomString(int length)
{
StringBuilder srb = new StringBuilder();
for (int i = 0; i < length; ++i)
{
srb.Append((char)(65 + random.Next(29));
}
return srb.ToString();
}
}
}