加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – VirtualizingStackPanel和TextWrapping错误? Windows Pho

发布时间:2020-12-15 18:03:00 所属栏目:百科 来源:网络整理
导读:我有一个奇怪的行为与VirtualizingStackPanel.我有一个列表,其中包含TextBlock与TextWrap =“Wrap”的项目.这是代码: ListBox x:Name="messagesList" ItemsSource="{Binding Messages}" ListBox.ItemContainerStyle Style TargetType="ListBoxItem" Setter
我有一个奇怪的行为与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>

它的工作相当不错,但如果我尝试滚动非常快(使用鼠标在模拟器,而不是prommatically)有一些滞后的滚动,可能Horizo??ntallOffset有时计算错误,在底部的结尾非常奇怪的结果(见图像,右图像演示了正常行为).

经过研究,我发现这个问题在组合VirtualizingStackPanel和TextBlock.TextWrap =“Wrap”,如果我从这对夫妇中删除一个元素都可以正常工作.

但是我需要虚拟化,因为大项目数量,TextWrap正确显示文本.

所以我想自己实现虚拟化面板,你可以引导我,怎么做,还是如何解决当前的问题?

UPD:问题:
在前两个图像上,ListBox已经(!)滚动到底部(不能再向下滚动),但是元素放置不正确,正确的放置显示在右边的图像上.只有当您滚动的时候才会发生这种情况.

UPD2:感谢米兰Aggarwal.他提供了一个很好的例子我的问题here.似乎这是一个在ListBox的错误.提供的解决方法不适合我的场景,因为我需要与ListBox项目中的控件进行交互.
现在我正在尝试捕获ManipulationCompleted事件,并检查它是否是惯性的,如果这样就意味着滚动并设置焦点到页面:

void messagesList_ManipulationCompleted(object sender,ManipulationCompletedEventArgs e)
    {
        if (e.IsInertial)
            this.Focus();
    }

附:感谢祝你好运祝福;)

解决方法

为了克服滚动上的黑色事件,您需要虚拟化滚动控件.为此,您应该继承IList并创建一个与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.我想这将使用虚拟化本身来解决.希望它有帮助

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读