视图不能由多个 ListView 共享 (View can't be shared by more than one ListView) 的一个解决方法
1.问题的起因
在WPF中遇到一异常,如题。
因此做一个Demo代码来复现问题,代码如下:
<Window x:Class="WpfAppThread.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="" Width="">
<Grid>
<Grid.Resources>
<Style x:Key="Style1" TargetType="ListView">
<Setter Property="View">
<Setter.Value>
<GridView></GridView>
</Setter.Value>
</Setter>
</Style>
</Grid.Resources> <ListView Name="ListView1" Style="{StaticResource Style1}">
</ListView> <ListView Name="ListView2" Style="{StaticResource Style1}">
</ListView>
</Grid>
</Window>
实质上就是把ListView的View视图定义放到了style中,然后两个ListView都使用了同一个style,结果,不必运行,编辑器就能提示错误:View can't be shared by more than one ListView,如下图:

当然了,实际的程序中我们大多是通过程序创建的ListView并为它指定style的,但报出来的异常和这个简单的Demo是一样的。
2.为什么会有这个问题呢?
Msdn上有篇文章(ListView 概述 http://msdn.microsoft.com/zh-cn/library/vstudio/ms750972.aspx )
摘两句如下:"两个 ListView 控件不能同时共用同一个视图模式。如果尝试将同一视图模式用于多个 ListView 控件,则会出现异常。
若要指定可同时由多个 ListView 使用的视图模式,请使用模板或样式。有关如何将视图定义为 Resources 的示例,请参见 ListView with Multiple Views Sample(具有多个视图的 ListView 示例)。"
由此可见,这个异常就是因为两个 ListView 控件不能同时共用同一个视图模式引起的。
3.怎么解决呢?
看到有帖子说使用X:Shared="false",试了一下,不行,还是报同样的异常。
其实,试着去掉ListView的View属性及再下级GridView定义,就发现不会引起异常,也就是说,ListView是从ListBox继承而来,如果不用View视图,那用的就仍然是ListBox那一套,而那一套因为相对简单,所以WPF支持,因此运行正常,而一旦使用了View及GridView,因为比较复杂,里面还有可能涉及多个不同子类及对象的创建,所以WPF就不支持了,索性禁止多个ListView共享同一个View视图。
而这样一来,其实解决方法也就有了,既然关闭这扇窗,那就开了另一扇窗,干脆我们就不共享View视图了,让每个ListView都使用自己的View视图就ok了,修改代码如下:

4.总结
把View和GridView从style里挪回到ListView中,就不会再报这个异常了,也就是说,让每个ListView都生成自己独立的View,这就好了,至于style,只把能共享的留下即可,例如宽度。
视图不能由多个 ListView 共享 (View can't be shared by more than one ListView) 的一个解决方法的更多相关文章
- Android ListView在增加HeaderView之后使用getLocationInWindow和getLocationOnScreen获得值不正确的解决方法
近日遇到一个很恶心的问题,把解决方法放到空间里来分享给大家: 问题发生的条件: 1)ListView 控件中使用addHeaderView,为其添加了一个header view.(基本常识:heade ...
- ListView点击事件失效(item里面有button按钮控件)解决方法
ListView点击事件失效解决方法: 一般出现这个情况,就是你的item里面有按钮的点击事件,你的item里面有button控件,button控件是抢占焦点的,只要在你的item布局里面这样子写就可 ...
- MVC的view页面内嵌C#语法发现路径被转码的解决方法
一,上视图代码,如下 console.log('@urlquery.ToString()'); console.log('@Html.Raw(urlquery.ToString())'); 二,显示结 ...
- android 修改listview item view 的方法(转)
android 修改listview item view 的方法 具体的解答办法很简单: 代码如下 : 1.获取需要更新的view int visiblePosition = mListView. ...
- android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。
我们直接入主题.所有问题例子请参照下图 1,怎样使图片具有点击事件? 答: 解决方法: 在你的BaseAdapter里面不要设置下面这三个东西,然后再设置GridView的onItemClick. g ...
- Listview的onItemClickListener无法响应的解决方法(转)
转:http://www.cnblogs.com/androidez/archive/2013/03/08/2950425.html 开发中很常见的一个问题,项目中的listview不仅仅是简单的文字 ...
- ListView 里面嵌套 GridView 遇到的问题及其解决方法。
我们直接入主题.所有问题例子请参照下图 1,怎样使图片具有点击事件? 答: 解决方法: 在你的BaseAdapter里面不要设置下面这三个东西,然后再设置GridView的onItemClick. g ...
- universal image loader在listview/gridview中滚动时重复加载图片的问题及解决方法
在listview/gridview中使用UIL来display每个item的图片,当图片数量较多需要滑动滚动时会出现卡顿,而且加载过的图片再次上翻后依然会重复加载(显示设置好的加载中图片) 最近在使 ...
- Android 中 ListView Adapter getView 被多次调用问题 解决方法
执行多次原因是因为每显示一个VIew,它都去测量view的高度,执行measure方法,导致getView执行多次. 解决方法是将 ListView 的 layout_width 设置为 fill_p ...
随机推荐
- C++ 推断一棵二叉树是否对称
一棵二叉树对称,就是说它假设以根为轴,翻转过去一样.例如以下图所看到的,以虚线为轴.把左边翻转到右边,各顶点及顶点中的值一一相应. watermark/2/text/aHR0cDovL2Jsb2cuY ...
- 架构师速成7.3-devops为什么非常重要
evops是一个非常高大上的名字,事实上说的简单点就是开发和运维本身就是一个团队的,要干就一起把事情干好.谁出了问题,站点都不行. 作为一个架构师.必需要devops,并且要知道怎样推行devops. ...
- WritePrivateProfileString GetPrivateProfileString 读取写 配置文件
Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfi ...
- vue 去掉元素之间空格 preserveWhitespace
preserveWhitespace 说明参考:https://vue-loader.vuejs.org/zh/options.html#compiler options: { compilerOpt ...
- ReactNative踩坑日志——OnPress随着render()执行被自动调用?
在ReactNative中,Text.Button以及其他Touchable包装成的可点击控件,都可以通过onPress属性为其指定点击时的响应函数. 在有些情况下,我们会把这些点击函数先定义好,然后 ...
- 【Thinking in Java】读书笔记
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6480258.html 第三章:操作符 1:基本数据类型的比较用 ==.!=,引用类型的==.!=是针对地址的比 ...
- 【leetcode】solution in java——Easy2
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6410409.html 6:Reverse String Write a function that takes ...
- 腾讯云ubuntu搭建jdk
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6377878.html 在购买了腾讯云ubuntu主机后,需要手动搭建java环境.安装tomcat等.ubun ...
- 快速生成100W条数据
快速生成100W条数据,生成的时候是顺序生成,取的时候是随机取用,生成100W条数据大概一分多钟,比网上其他代码速度要快很多 )) --truncate table tb --select top 1 ...
- Kettle实现数据库迁移
Kettle实现数据库迁移 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为实现数据库的迁移,即 ...