C# WP8中LongListSelector的scrollTo函数性能滞后?
这里要演示的问题是我的代码隐藏代码C# WP8中LongListSelector的scrollTo函数性能滞后?,c#,windows-phone-8,scroll,longlistselector,C#,Windows Phone 8,Scroll,Longlistselector,这里要演示的问题是我的代码隐藏代码 public partial class MainPage : PhoneApplicationPage { ObservableCollection<ABC> listTest = new ObservableCollection<ABC>(); // Constructor public MainPage() { InitializeComponent(); for
public partial class MainPage : PhoneApplicationPage
{
ObservableCollection<ABC> listTest = new ObservableCollection<ABC>();
// Constructor
public MainPage()
{
InitializeComponent();
for (int i = 0; i < 50; i++)
{
ABC conv = new ABC(string.Format("Test:{0}", i));
listTest.Add(conv);
}
testLls.ItemsSource = listTest;
}
private void Button_Tap_1(object sender, System.Windows.Input.GestureEventArgs e)
{
testLls.ScrollTo(listTest[listTest.Count - 1]);
}
private void TitlePanel_Tap_1(object sender, System.Windows.Input.GestureEventArgs e)
{
Stopwatch st = Stopwatch.StartNew();
testLls.ScrollTo(listTest[listTest.Count - 1]);
st.Stop();
Debug.WriteLine("tttt:", st.ElapsedMilliseconds);
}
class ABC
{
private string _name;
public ABC(string aa)
{
this._name = aa;
}
public string Name
{
get
{
return _name;
}
}
public Visibility GroupMemberVisibility
{
get
{
return Visibility.Collapsed;
}
}
}
}
public部分类主页:PhoneApplicationPage
{
ObservableCollection listTest=新的ObservableCollection();
//建造师
公共主页()
{
初始化组件();
对于(int i=0;i<50;i++)
{
ABC conv=newabc(string.Format(“Test:{0}”,i));
添加(conv);
}
testLls.ItemsSource=listTest;
}
私有无效按钮\u点击\u 1(对象发送者,System.Windows.Input.GestureEventArgs e)
{
ScrollTo(listTest[listTest.Count-1]);
}
私有无效标题面板点击1(对象发送器,System.Windows.Input.GestureEventArgs e)
{
Stopwatch st=Stopwatch.StartNew();
ScrollTo(listTest[listTest.Count-1]);
st.Stop();
Debug.WriteLine(“tttt:,st.elapsedmillyses”);
}
ABC班
{
私有字符串\u名称;
公共ABC(字符串aa)
{
这个。_name=aa;
}
公共字符串名
{
得到
{
返回_name;
}
}
公共可见性组成员可见性
{
得到
{
返回可见性。折叠;
}
}
}
}
Xaml代码
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28" Tap="TitlePanel_Tap_1">
<TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
<TextBlock Text="page name" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<phone:LongListSelector Name="testLls" VirtualizingStackPanel.VirtualizationMode="Standard" >
<phone:LongListSelector.ItemTemplate>
<DataTemplate x:Name="dtRecievedBubbleText" >
<Grid x:Name="LayoutRoot" Background="Transparent" Margin="24 0 0 14" HorizontalAlignment="Left">
<Grid.RowDefinitions>
<RowDefinition Height="14" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Rectangle Grid.RowSpan="3" Fill="{Binding BubbleBackGroundColor}" />
<TextBlock Text="test" Visibility="{Binding GroupMemberVisibility}" FontSize="22" FontFamily="Segoe WP Semibold" Margin="12, 12, 0, 0" />
<TextBlock Grid.Row="2" Text="{Binding Name}" HorizontalAlignment="Right" Margin="0,0,12,6" FontSize="18" />
</Grid>
</Grid>
</DataTemplate>
</phone:LongListSelector.ItemTemplate>
</phone:LongListSelector>
</Grid>
点击标题时,包含元素的长列表选择器滚动到底部。当元素值从30-50-100个元素变化时,观察到的时间分别为20ms、744ms、815ms。测试是用诺基亚Lumia 620完成的
在这个示例中,项目模板非常简单,但在实际场景中,我的项目模板要复杂得多。因此,对于100个元素,该场景所用的时间为1753ms
为什么时间差如此之大这能以任何方式改进吗
是否有其他人注意到了这一点?有一种解决方法可以解决此问题
从lls提取视口,然后设置视口原点
要提取视口,我们必须在xaml中添加样式
<Style x:Name="llsMessagesStyle" TargetType="phone:LongListSelector">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="phone:LongListSelector">
<Grid Background="{TemplateBinding Background}" d:DesignWidth="480" d:DesignHeight="800">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ScrollStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="00:00:00.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Scrolling">
<Storyboard>
<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="VerticalScrollBar"/>
</Storyboard>
</VisualState>
<VisualState x:Name="NotScrolling"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid Margin="0">
<ViewportControl x:Name="ViewportControl" HorizontalContentAlignment="Stretch" VerticalAlignment="Bottom" Loaded="ViewPortLoaded"/>
<ScrollBar x:Name="VerticalScrollBar" Style="{StaticResource ChatThemeScrollBarStyle}" Opacity="0" Margin="2 0 2 0" Orientation="Vertical" HorizontalAlignment="Right" Width="5" ValueChanged="vScrollBar1_ValueChanged" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
通过这种方式,我们可以实现所需的功能。有一种解决方法来解决此问题
从lls提取视口,然后设置视口原点
要提取视口,我们必须在xaml中添加样式
<Style x:Name="llsMessagesStyle" TargetType="phone:LongListSelector">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="phone:LongListSelector">
<Grid Background="{TemplateBinding Background}" d:DesignWidth="480" d:DesignHeight="800">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="ScrollStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="00:00:00.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Scrolling">
<Storyboard>
<DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="VerticalScrollBar"/>
</Storyboard>
</VisualState>
<VisualState x:Name="NotScrolling"/>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid Margin="0">
<ViewportControl x:Name="ViewportControl" HorizontalContentAlignment="Stretch" VerticalAlignment="Bottom" Loaded="ViewPortLoaded"/>
<ScrollBar x:Name="VerticalScrollBar" Style="{StaticResource ChatThemeScrollBarStyle}" Opacity="0" Margin="2 0 2 0" Orientation="Vertical" HorizontalAlignment="Right" Width="5" ValueChanged="vScrollBar1_ValueChanged" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
通过这种方式,我们可以实现所需的功能