C# 虚拟化StackPanel和文本包装错误?Windows Phone
我对C# 虚拟化StackPanel和文本包装错误?Windows Phone,c#,silverlight,windows-phone-7,xaml,virtualizingstackpanel,C#,Silverlight,Windows Phone 7,Xaml,Virtualizingstackpanel,我对虚拟化StackPanel有一种奇怪的行为。我有一个包含TextBlock和TextWrap=“Wrap”的项目列表。代码如下: <ListBox x:Name="messagesList" ItemsSource="{Binding Messages}" > <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Pr
虚拟化StackPanel
有一种奇怪的行为。我有一个包含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>
附言:谢谢你的好运祝福;) 第二屏有什么问题?你是说在最后一条消息之后有很大的空白?最后一条消息没有放在页面底部?我说得对吗 事实上,我没有试图重现您的代码和bug,但我的观点是,既然您在应用程序中使用了第三方LIB(Silverlight Toolkit),为什么不同时使用 我写了这个虚拟类:
public class Message
{
public string Time { get; private set; }
public string Content { get; private set; }
public Message(string time, string content)
{
Time = time;
Content = content;
}
}
然后我将这个伪代码放在主页构造函数中:
var _messages = new ObservableCollection<Message>();
for (int i = 0; i < 50; i++)
{
_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 "));
}
this.ListBox.ItemsSource = _messages;
var\u messages=新的ObservableCollection();
对于(int i=0;i<50;i++)
{
_添加(新消息(“12:40”,“非常长的字符串,应该包装。Pavel Durov给WP7竞赛优胜者的钱比他给Android/iOS优胜者的钱要少。fffuuuuu”);
}
this.ListBox.ItemsSource=\u消息;
在xaml中,我放置了一个列表框,其中包含toolkit的聊天气泡控件:
<ListBox x:Name="ListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<c4fToolkit:ChatBubble>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Text="{Binding Content}"
TextWrapping="Wrap"/>
<TextBlock Grid.Row="1"
Text="{Binding Time}"
HorizontalAlignment="Right"/>
</Grid>
</c4fToolkit:ChatBubble>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我运行它,没有看到奇怪的行为,可能有点滞后。
结果是:
希望我能帮上忙
为了克服滚动时出现的黑点,需要虚拟化滚动控件。为此,您应该继承
IList
并创建自己的集合
,类似于ObservableCollection
,其中您必须根据缓存要求覆盖默认索引器,同时为项目维护缓存。我觉得这可能就是你想要的:
该页面上有一个示例项目。试试看
我也觉得你正面临这个问题。我想这将通过虚拟化本身来解决。希望对您有所帮助第二张图片有什么问题?到底是黑色区域出现了,还是滚动结束后ScrollView没有“反弹”以用内容填充黑色区域 了解这一点至关重要,因为。。。这种效果对于WPF/WP7来说很自然。。 顺便说一句,滚动程序应该在过度滚动后“反弹”,但它似乎有一个错误,有时会忘记这样做 我这样问是因为黑白区域不仅在WP7上经常出现,而且在任何有XAMLish ScrollViewer和惯性滚动的地方也经常出现。你看,当滚动速度超过平台提供新项目的速度时,你只需滚动到预先计算的项目之外,一旦你“翻过”滚动很远,缓慢进入的项目就会突然发现没有更多的项目,因此返回空白区域 当某些情况同时发生时,通常会发生这种情况:滚动速度快(耶),绑定速度慢(表达式过于复杂),模板呈现速度慢(复杂的不可重用UI模板),绑定不知道有多少项(绑定到
IEnumerable
非IList
->否.计数信息!),或者渲染器不知道为项目保留多少高度(项目不是恒定高度,但必须计算每个项目以确定其自身的确切高度)
如果您想纠正它,您必须首先与这些原因进行斗争,或者您必须实现自己的滚动或侵入虚拟化堆栈面板,并将bindingsource中的项目馈送与滚动同步,以便滚动器更好地猜测总高度:例如,一次只显示一个小项目,收听滚动事件,并从列表的开头/结尾动态添加/删除下一组项目。。这将通过不允许快速滚动来解决此问题:(()()))
我相信限制物品高度是最简单的方法。难道你不能做些聪明的事情,使项目的实际大小不变吗?我建议你创建一个最简单的函数,计算包装文本块的高度并绑定到该高度。这样,您可以从列表框中的可变高度项中获益,但可以继续使用虚拟化堆栈面板 OFF_TOPIC:Good luck in VK contest=)不,此控件也有此问题,只需制作不同高度的项目并将其放置在按钮中,例如,单击任何按钮并滚动,这将重现错误。我刚刚记得我在上一个项目中遇到此问题,我毫不怀疑它存在于我当前的项目中。但是这个bug出现的条件(快速滚动)对我来说不正常,所以我没有尝试修复它。=)否,项目的高度必须不同,它们必须显示其所有内容。米兰·阿加瓦尔(Milan Aggarwal)发布了一个很好的问题演示链接。我理解这一点,而且我有很多应用程序都有同样的问题。真的,你必须关注我指出的几件事。然后,一些组合只是强制产生这种效果。另一件事,你可以尝试禁用“惯性滚动”,并保留正常的、平滚动,但这通常也是不利的,因为这会降低“感觉”。。如果不看清楚你的具体情况,我无法进一步帮助你。我只能指出共同的原因。它本身的问题完全与代码、绑定和呈现的性能有关。
<ListBox x:Name="ListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<c4fToolkit:ChatBubble>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0"
Text="{Binding Content}"
TextWrapping="Wrap"/>
<TextBlock Grid.Row="1"
Text="{Binding Time}"
HorizontalAlignment="Right"/>
</Grid>
</c4fToolkit:ChatBubble>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>