使用WPF实现日志查看器

使用WPF实现日志查看器

我寻求有关使用WPF实现控制台日志查看器的最佳方法的建议。

它应符合以下标准:

  • 快速滚动100.000+行

  • 某些条目(如stacktraces)应该是可折叠的

  • 长项包裹

  • 列表可以按不同的标准(搜索,标签等)进行过滤

  • 在最后,它应该在添加新项目时继续滚动

  • 线元素可以包含某种添加格式,如超链接和出现计数器

总的来说,我有一些想法,如FireBug和Chrome的控制台窗口。

我玩这个但是我没有取得多大进展,因为...... - 数据网格无法处理不同的项目高度 - 滚动位置仅在释放滚动条后更新(这是完全不可接受的)。

我很确定,我需要某种形式的虚拟化,并希望遵循MVVM模式。

欢迎任何帮助或指示。


倚天杖
浏览 1693回答 2
2回答

元芳怎么了

HighCore答案是完美的,但我想它缺少这个要求:“当最后,它应该在添加新项目时继续滚动”。根据这个答案,你可以这样做:在主ScrollViewer(DockPanel内)中,添加事件:<ScrollViewer&nbsp;CanContentScroll="True"&nbsp;ScrollChanged="ScrollViewer_ScrollChanged">转换事件源以执行自动滚动:&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;bool&nbsp;AutoScroll&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;ScrollViewer_ScrollChanged(object&nbsp;sender,&nbsp;ScrollChangedEventArgs&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;User&nbsp;scroll&nbsp;event&nbsp;:&nbsp;set&nbsp;or&nbsp;unset&nbsp;autoscroll&nbsp;mode &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(e.ExtentHeightChange&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;Content&nbsp;unchanged&nbsp;:&nbsp;user&nbsp;scroll&nbsp;event &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((e.Source&nbsp;as&nbsp;ScrollViewer).VerticalOffset&nbsp;==&nbsp;(e.Source&nbsp;as&nbsp;ScrollViewer).ScrollableHeight) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;Scroll&nbsp;bar&nbsp;is&nbsp;in&nbsp;bottom &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Set&nbsp;autoscroll&nbsp;mode &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AutoScroll&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;Scroll&nbsp;bar&nbsp;isn't&nbsp;in&nbsp;bottom &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Unset&nbsp;autoscroll&nbsp;mode &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AutoScroll&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Content&nbsp;scroll&nbsp;event&nbsp;:&nbsp;autoscroll&nbsp;eventually &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(AutoScroll&nbsp;&&&nbsp;e.ExtentHeightChange&nbsp;!=&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;//&nbsp;Content&nbsp;changed&nbsp;and&nbsp;autoscroll&nbsp;mode&nbsp;set &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Autoscroll &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(e.Source&nbsp;as&nbsp;ScrollViewer).ScrollToVerticalOffset((e.Source&nbsp;as&nbsp;ScrollViewer).ExtentHeight); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP