我的原型显示"文档",其中包含由缩略图图像表示的"页面".每个文档可以包含任意数量的页面.例如,可能有1000个文档,每个文档有5个页面,或者5个文档,每个文档有1000个页面,或者介于两者之间.文件不包含其他文件.在我的xaml标记中,我有一个ListBox,其ItemsTemplate
引用的innerItemsTemplate也有一个ListBox.我想要2级选定的项目,以便我可以对文档或页面执行各种操作(删除,合并,移动到新位置等).innerItemsTemplate ListBox使用a WrapPanel作为ItemsPanelTemplate.
对于我有大量文档的情况,每个文档都有几个页面(比如10000个文档,每个页面有5个页面),滚动工作非常好,这要归功于UI虚拟化VirtualizingStackPanel.但是,如果我有大量的页面,我会遇到问题.具有1000页的文档一次仅显示约50个(无论何种适合屏幕),当我向下滚动时,外部ListBox移动到下一个文档,跳过不可见的950页左右.除此之外,VirtualzingWrapPanel应用程序内存确实没有
增加.
我想知道我是否以正确的方式解决这个问题,特别是因为它有点难以解释!我希望能够显示10000个文档,每个文档1000页(仅显示适合屏幕的任何内容),使用UI虚拟化,以及平滑滚动.
如何在显示下一个文档之前确保滚动在文档中的所有页面中移动,并且仍然保持UI虚拟化?滚动条似乎只移动到下一个文档.
表示"文档"和"页面"似乎合乎逻辑 - 使用我当前ListBox在a 中使用a的方法ListBox?
我非常感谢你的任何想法.谢谢.
是否可以以编程方式滚动WPF列表视图?我知道winforms不会这样做,对吧?
我说的是向上或向下滚动50个单位等.不要一次滚动整个项目高度.
我有一个ListBox可能有很多行的模板化DB记录,包括一个Image,绑定到一个ObservableCollection<MyItem>.有时收藏可以容纳数千件物品.
性能很好,但滚动是默认的跳跃行为.我希望它有平滑的滚动,所以我取消选中ScrollViewer.CanContentScroll.
现在我有平滑的滚动,但性能很可怕:数据在一个单独的线程中检索,并且线程快速完成,但结果显示在中需要10-20秒ListBox.我假设这是因为取消选中ScrollViewer.CanContentScroll将底层更改VirtualizingStackPanel为常规StackPanel,因此在显示结果之前加载整个集合.
所以我的问题是:如何在不牺牲VirtualizingStackPanel行为和性能的情况下保持平滑滚动?
我在FlowDocumentReader中使用ViewingMode ="Scroll"显示FlowDocument.如果我在鼠标上使用滚轮,则文档滚动速度非常慢.我想增加滚动步骤.
我试图在控制面板中更改鼠标的滚动设置,但这没有任何效果.我认为WPF忽略了FlowDocumentScrollViewer的设置.
我在FlowDocument和FlowDocumentReader上添加了一个Scroll事件,但是当我使用鼠标滚轮时,它不会触发.
我在FlowDocumentReader上添加了一个Loaded事件,得到了ScrollViewer后代,从滚动查看器的模板中找到了ScrollBar("PART_VerticalScrollBar")并调整了SmallChange和LargeChange属性.这也没有任何影响.
有人有主意吗?
我正在尝试根据我的需要调整ListBox的行为,我遇到了几个问题
1)如何以编程方式设置ListBox的滚动位置
ListBox不提供其内部ScrollViewer的访问器,因此您无法将其滚动到任何您想要的位置.
2)如何准确设置垂直滚动(即如何平滑滚动)?
默认情况下,无法通过一次滚动一个完整元素来滚动其他列表(列表框将始终确保第一个元素完全显示)
在大多数情况下这种行为是可以的,但不是我的:我想要一个平稳的运动...),
WPF有一个解决这个问题的方法,但Silverlight没有解决方案(请参阅问题"是否可能实现 - 在-wpf-listview中实现平滑滚动").
3)如何捕获MouseDown和MouseUp事件:
如果您继承ListBox,您可能能够捕获MouseUp和MouseMove事件.但是,MouseUp事件永远不会被触发(我怀疑它被ListBox子元素吃掉了)
<ScrollViewer VerticalScrollBarVisibility="Auto" CanContentScroll="True">
<StackPanel Name="basePanel" Orientation="Vertical" Height="450" />
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)
这是stackpanel的代码,它在运行时用多个WrapPanel填充.滚动查看器滚动面板 - 一次一个 - 这使得它非常不方便,因为所有面板都有不同的尺寸.我想这一个在StackPanel中设置ScrollViewer.CanContentScroll ="假"的属性,而在ScrollViewer中删除,并没有帮助-滚动条消失的.平滑滚动条的解决方案是什么?
我的情况是我的C#WPF应用程序包含一个ListView,其元素是Expanders.每个扩展器都包含一个带有ListViewItems的ListView.这是一张图片:

在右侧,您可以看到滚动条.那个ScrollBar是我的问题.它有两个问题:
在扩展列表上使用MouseWheel时,ScrollBar不起作用.我指的是从"Controller"到"FullInstallation"的区域.如果将鼠标悬停在标题上("所有测试"),ScrollBar会滚动.我认为Expander中的ListView默认有一个ScrollBar,它"窃取"了MouseWheel事件.但是,我不知道该怎么办.
ScrollBar滚动扩展器项目,而不是扩展器的内容.我的意思是,不可能向下滚动一点,而是总是向下滚动至少1个Expander项目.我希望滚动条滚动,以便可以看到例如"All Tests"Expander的一半.
该图显示了禁用的滚动条,但通过缩小窗口,滚动条将启用.
到目前为止我尝试了什么:
外部ListView外部的ScrollViewer:这解决了问题1,但这意味着MouseWheel根本不起作用!这是因为外部ListView生成了自己的ScrollViewer(使用Snoop来查找它),它"窃取"了MouseWheel事件.
将所有控件(ListView,Expander,ListViewItem)的所有MouseWheel事件重定向到ScrollViewer:我再次使用外部ListView外部的ScrollViewer,这次我使用MouseWheel事件为我的所有控件调用外部的MouseWheel事件ScrollViewer中.这确实有效,但是对于鼠标指针的某些位置它没有.例如,在两个ListViewItem之间有一个小的1毫米空间,其中没有捕获MouseWheel事件.或者在最后一个Expander("Short Tests")之后的底部.在那里,我没有得到任何事件.
我尝试了更多的东西,但没有进一步.有谁知道如何解决这个问题?
祝愿,基督徒
wpf ×6
scroll ×4
c# ×3
listbox ×3
listview ×2
.net ×1
performance ×1
silverlight ×1
stackpanel ×1