视图不能由多个 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 ...
随机推荐
- vCenter Server Virtual Appliance features and benefits
http://vmwire.com/tag/vcsa/ Installed on SUSE Linux Enterprise Server 11 x64. OVF when deployed is c ...
- Android 使用DDMS查看内存使用情况
- JSON语言规范与Java中两种解析工具基本使用
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6652250.html 一:JSON语言规范 一言以蔽之:“一个 :一个键值对,一个{}一个对象,一个[]一个 ...
- 从头開始学 RecyclerView(三) 封装简化
前言 上一篇的代码,也是基于这些封装的. RV的封装,跟曾经的listView之类的封装,大同小异. 这里,从@devwiki 处,将代码搬过来.基本无改动 BaseHolder的优化 使ViewHo ...
- python 测试时一个str是不是字符串
# -*- coding: cp936 -*- #python 27 #xiaodeng #测试时一个str是不是字符串 def isAstring(obj): ''' 测试一个str是不是字符串 b ...
- Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件
转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...
- oracle加密-des 简单举例.
Declare v_seed Raw(128); v_key_1 Raw(64); v_key_2 Raw(64); v_Text_for_encrypted Raw(64); v_mw ...
- 自动化部署必备技能—定制化RPM包[转载]
回顾下安装软件的三种方式: 1.编译安装软件,优点是可以定制化安装目录.按需开启功能等,缺点是需要查找并实验出适合的编译参数,诸如MySQL之类的软件编译耗时过长. 2.yum安装软件,优点是全自动化 ...
- 如何使用SetTimer
1.SetTimer定义在那里? SetTimer表示的是定义个定时器.根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了. SetTimer有两个函数.一个 ...
- MapReduce 模式、算法和用例
翻译自:http://highlyscalable.wordpress.com/2012/02/01/mapreduce-patterns/ 在这篇文章里总结了几种网上或者论文中常见的MapReduc ...