title author date CreateTime categories
WPF 解决 ListView 的滚动条不显示
lindexi
2018-11-30 19:24:57 +0800
2018-11-30 19:14:21 +0800
WPF

本文告诉大家如何解决一个诡异的问题,如果有一个 ListView 同时里面的元素的高度很长,但是滚动条就是不显示,怎么让这个滚动条显示

本文不属于小白博客,忽略所有的业务环境和样式问题以及对 ScrollViewer 的设置问题

在开始发现这个问题请先看 ListView 的滚动条,通过继承 ListView 或 ListBox 可以在 Load 事件拿到滚动条,需要判断 ScrollViewer 的 ExtentHeight 的大小

        private void ListBox_Loaded(object sender, RoutedEventArgs e)
{
_scroll = this.VisualDescendant<ScrollViewer>();
}

如果拿到的 _scroll 的 ExtentHeight 的大小相对预期小,则可以继续看本文的方法,如果有一些方法 Load 之后还没有设置数据可以等待设置数据之后通过 Dispatcher.InvokeAsync 的方法判断 ExtentHeight 的高度

如果这时高度太小,可能是因为 ItemsPresenter 没布局,尝试使用下面的代码解决

        protected override void OnItemsSourceChanged(IEnumerable oldValue, IEnumerable newValue)
{
Dispatcher.InvokeAsync(() =>
{
InvalidateMeasure(); if (_scroll != null)
{
ItemsPresenter itemsPresenter = _scroll.Content as ItemsPresenter;
var size = new Size(double.PositiveInfinity, double.PositiveInfinity);
itemsPresenter?.Measure(size);
itemsPresenter?.InvalidateMeasure();
}
}); base.OnItemsSourceChanged(oldValue, newValue);
}

所有在 ItemsControl 的类都有 OnItemsSourceChanged 重写这个类都是在用户设置数据,在用户设置数据的时候,通过 Dispatcher.InvokeAsync 重新计算,这样就可以解决滚动条不显示

这样的原理是滚动条是否出现是通过判断 ScrollableHeight 或 ScrollableWidth 的值,但是这个值是通过判断内容的长度或宽度减去显示的长度宽度如果显示的内容大于内容就不显示。

通过 ItemsPresenter 重新布局就是解决这样的问题,在 ScrollViewer 的判断 ScrollableHeight 是通过 this.ExtentHeight - this.ViewportHeight 同时宽度是 this.ExtentWidth - this.ViewportWidth 判断

这里的 ExtentHeight 会收到用户的滚动条的一个设置 CanContentScroll 的修改,当然本文的方法能解决的是 CanContentScroll 已经设置为 false 这样 ExtentHeight 就是内容的长度

通过 ScrollViewer.Content 可以知道 ExtentHeight 和 ExtentWidth 这个在 ListView 等是 ItemsPresenter 如果出现 ExtentHeight 太小就可能是 ItemsPresenter 布局不对

.net Framework 源代码 · ScrollViewer

2018-11-30-WPF-解决-ListView-的滚动条不显示的更多相关文章

  1. [WPF]解决ListView在没有Items时,水平滚动条不出现的问题

    转载地址:http://www.cnblogs.com/nankezhishi/archive/2010/03/19/FixListViewNotScrollHeaderBug.html 在上一篇Bl ...

  2. 2018.11.30 zsh: command not found: mysql 的解决办法mac环境下

    系统环境变量的问题.解决办法: 1.打开终端.输入open .zshrc 会出现一个可编辑文档, 2.找到# User configuration部分,在下一行添加source ~/.bash_pro ...

  3. 解决 ListView 水平滚动条不出现的问题(转载)

    问题的原因:http://www.cnblogs.com/nankezhishi/archive/2010/03/17/wpfbug13.html 解决方法:http://www.cnblogs.co ...

  4. WPF:解决DataGrid横向滚动条无法显示的问题

    DataGrid的最后一列的宽度设置为“Width=”auto””即可. 如果显示指定长度或者设置为“*”,那么不管怎么拖动列头,或者不管行里面的内容有没有超过DataGrid的显示区域,DataGr ...

  5. Python练习-列表生成式-2018.11.30

    #用列表生成式创建[1x1, 2x2, 3x3, ..., 10x10] print([x*x for x in range(1,11)]) #用列表生成式创建[2x2, 4x4,,6×6,..., ...

  6. 2018.11.30开始学习shader

    学习资料: 乐乐女神的<unity Shader入门精要>

  7. 2018.11.30 bzoj3230: 相似子串(后缀数组)

    传送门 后缀数组入门题. 建立正反两个后缀数组算就行了. 代码: #include<bits/stdc++.h> #define ri register int using namespa ...

  8. 2018.11.30 spoj220 Relevant Phrases of Annihilation(后缀数组+二分答案)

    传送门 代码: 先用特殊字符把所有字符串连接在一起. 然后二分答案将sasasa数组分组. 讨论是否存在一个组满足组内对于每一个字符串都存在两段不相交字串满足条件. #include<bits/ ...

  9. 2018.11.30 浪在ACM 集训队第七次测试赛

    https://blog.csdn.net/StilllFantasy/article/details/84670643 感谢刘凯同学 https://blog.csdn.net/UnKfrozen/ ...

  10. 解决ListView在界面只显示一个item

    ListView只显示一条都是scrollview嵌套listView造成的,将listView的高度设置为固定高度之后,三个条目虽然都完全显示.但是这个地方是动态显示的,不能写死.故采用遍历各个子条 ...

随机推荐

  1. Matlab 路径函数

    1 fileparts [pathstr,name,ext] = fileparts(filename) 将filename字符串分解成路径,文件名和文件后缀.文件可以不存在,ext中含有前缀dot( ...

  2. PHP的cURL扩展库使用详解

    在还没有接触curl的时候,相信大家在获取网页内容的时,使用得最多的一个函数就是:file_get_contents(),但是它的可控制性不够灵活,无法处理错误情况,对于各种复杂情况的采集更是显得有点 ...

  3. 跟我一起做一个vue的小项目(六)

    接下来我们编写周末游组件 <template> <div> <div class="recommend-title">周末去哪儿</div ...

  4. PHP苹果推送实现(APNS)

    以下资料网上收集整理得来 1.在ios dev center制作相关证书和文件用客户端实现(不再赘述,网上很多,) 网上教程: http://blog.csdn.net/lizhenning87/ar ...

  5. MySQL8.0.17 - Multi-Valued Indexes 简述

    本文主要简单介绍下8.0.17新引入的功能multi-valued index, 顾名思义,索引上对于同一个Primary key, 可以建立多个二级索引项,实际上已经对array类型的基础功能做了支 ...

  6. Django项目:CRM(客户关系管理系统)--40--32PerfectCRM实现King_admin添加不进行限制

    # forms.py # ————————19PerfectCRM实现King_admin数据修改———————— from django import forms from crm import m ...

  7. nginx、php-fpm启动脚本

    Nginx官方启动脚本 //service nginx stop|start|restart|reloadtouch /etc/init.d/nginx chmod nginxvi /etc/init ...

  8. 读书笔记--Head First JQuery目录

    1.JQuery入门 2.选择器与方法 3.JQuery事件与函数 4.JQuery Web页面管理 5.JQuery效果与动画 6.JQuery与JavaScript 7.定制函数停工定制效果 8. ...

  9. ucore os 初始化

    从bootloader 交出控制权开始 bootloader 最后调用 ((void(*))(void) ()ELF->e_entry& 0xffffff)() ; lab2 虽然e_e ...

  10. round 469

    第一次打codeforces,还是太菜了 代码全部来自大神void_f C #include <cstdio> #include <vector> #include <c ...