Ale*_*der 10 c# silverlight xaml virtualizingstackpanel windows-phone-7
我有一个奇怪的行为VirtualizingStackPanel.我有一个包含项目的列表TextBlock与TextWrap="Wrap".这是代码:
<ListBox x:Name="messagesList" ItemsSource="{Binding Messages}" >
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<toolkit:ContextMenuService.ContextMenu>
<toolkit:ContextMenu>
...
</toolkit:ContextMenu>
</toolkit:ContextMenuService.ContextMenu>
<CheckBox Style="{Binding Own, Converter={StaticResource MsgTypeToStyle}}"
Tag="{Binding TimeString}"
IsEnabled="True">
<TextBlock Text="{Binding Content}" TextWrapping="Wrap"/>
</CheckBox>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是如果我尝试滚动得非常快(在模拟器上使用鼠标,而不是主要的)滚动中有一些滞后,可能HorizontallOffset有时会计算错误,并且在底部结尾会产生非常奇怪的结果(见图像,右图)说明正常行为).

研究后,我想通了,在组合问题VirtualizingStackPanel及TextBlock.TextWrap="Wrap",如果我从这个夫妻都工作正常删除一个元素.
但我需要虚拟化,因为大项目数量,以及TextWrap正确的文本显示.
所以我考虑自己实现虚拟化面板,请指导我,如何做到这一点,或者如何解决当前的问题?
UPD:问题:
在前两个图像ListBox已经(!)滚动到底部(它不能再向下滚动),但元素放置不正确,正确放置在右图像上.只有在滚动速度非常快时才会发生这种情况.
UPD2:感谢Milan Aggarwal.他在这里提供了一个很好的问题.似乎这真的是一个错误ListBox.提供的解决方法不适合我的方案,因为我需要与ListBox项目内的控件进行交互.现在我正在尝试捕获ManipulationCompleted事件并检查它是否是Inertial,如果是这样意味着滚动并将焦点设置为页面:
void messagesList_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
if (e.IsInertial)
this.Focus();
}
Run Code Online (Sandbox Code Playgroud)
PS感谢祝你好运;)
为了克服滚动时出现的黑色现象,您需要虚拟化滚动控件.为此,您应该继承IList并创建Collection自己的类似于ObservableCollection您必须根据您的缓存要求覆盖默认索引器并同时为您的项目维护缓存.我觉得这可能是你想要的:http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx
该页面上有一个示例项目.试试吧.
我也觉得你正面临这个问题http://blog.rsuter.com/?p=258.我想这将使用虚拟化本身来解决.希望能帮助到你
第二屏有什么问题吗?你的意思是最后一条消息后有很大的空白空间?最后一条消息没有放在页面底部?我说得对吗?
\n\n实际上我并没有尝试重现您的代码和错误,但我的观点是,既然您在应用程序中使用第 3 方库(Silverlight Toolkit),为什么不也使用Coding4Fun Tools ?
\n\n我写了这个虚拟类:
\n\npublic class Message\n{\n public string Time { get; private set; }\n public string Content { get; private set; }\n\n public Message(string time, string content)\n {\n Time = time;\n Content = content;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然后我将这个虚拟代码放入主页构造函数中:
\n\nvar _messages = new ObservableCollection<Message>();\n\nfor (int i = 0; i < 50; i++)\n{\n _messages.Add(new Message("12:40", "Teh very long string which should be wrapped. Pavel Durov gives WP7 Contest winners less money than he did for Android/iOS winners. FFFUUUUUUUUUUUUUU "));\n}\n\nthis.ListBox.ItemsSource = _messages;\nRun Code Online (Sandbox Code Playgroud)\n\n在 xaml 中,我放置了一个带有工具包聊天气泡控件的列表框:
\n\n<ListBox x:Name="ListBox">\n <ListBox.ItemTemplate>\n <DataTemplate>\n <c4fToolkit:ChatBubble>\n <Grid>\n <Grid.RowDefinitions>\n <RowDefinition Height="Auto"/>\n <RowDefinition Height="Auto"/>\n </Grid.RowDefinitions>\n <TextBlock Grid.Row="0"\n Text="{Binding Content}"\n TextWrapping="Wrap"/>\n <TextBlock Grid.Row="1"\n Text="{Binding Time}"\n HorizontalAlignment="Right"/>\n </Grid>\n </c4fToolkit:ChatBubble>\n </DataTemplate>\n </ListBox.ItemTemplate>\n</ListBox>\nRun Code Online (Sandbox Code Playgroud)\n\n我运行了它,没有看到奇怪的行为,也许有点滞后。\n结果是:
\n\n
希望我做了一些帮助。
\n\n\xd0\xa3\xd0\xb4\xd0\xb0\xd1\x87\xd0\xb8 \xd1\x81 \xd0\xba\xd0\xbe\xd0\xbd\xd0\xba\xd1\x83\xd1\x80\xd1 \x81\xd0\xbe\xd0\xbc、\xd1\x8f\xd0\xb1\xd1\x81\xd0\xb0\xd0\xbc\xd0\xbf\xd0\xbe\xd1\x83\xd1\x87\xd0\ xb0\xd1\x81\xd1\x82\xd0\xb2\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbb,\xd0\xbd\xd0\xbe\xd0\xbd\xd0\xb5\xd0\xb2 \xd0\xb5\xd1\x80\xd1\x8e,\xd1\x87\xd1\x82\xd0\xbe \xd0\xb7\xd0\xb0 1,5 \xd0\xbc\xd0\xb5\xd1\x81\xd1 \x8f\xd1\x86\xd0\xb0 \xd1\x83\xd0\xb4\xd0\xb0\xd1\x81\xd1\x82\xd1\x81\xd1\x8f \xd1\x81\xd0\xb4\xd0\xb5 \xd0\xbb\xd0\xb0\xd1\x82\xd1\x8c \xd0\xbf\xd1\x80\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x87\xd0\xbd\xd1\x8b\xd0 \xb9\xd0\xba\xd0\xbb\xd0\xb8\xd0\xb5\xd0\xbd\xd1\x82。
\n