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>