设置itemcontrol的item点击前后不同状态
转自:http://www.cnblogs.com/linzheng/p/3764300.html
<Page.Resources>
<!--选中数据项的样式-->
<DataTemplate x:Key="dataTemplateSelectKey" x:Name="dataTemplateSelectName">
<Grid Tapped="StackPanel_Tap_1" Background="Red">
<TextBlock Text="{Binding LastName}" FontSize="50" />
</Grid>
</DataTemplate>
<!--默认数据项的样式,注意默认的数据项样式不能在C#中再次调用-->
<DataTemplate x:Key="dataTemplateDefaultKey" x:Name="dataTemplateDefaultName">
<StackPanel Orientation="Horizontal" Tapped ="StackPanel_Tap_1" x:Name="sp">
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text=", "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
</DataTemplate>
<!--非选中数据项的样式-->
<DataTemplate x:Key="dataTemplateNoSelectKey" x:Name="dataTemplateNoSelectName">
<StackPanel Orientation="Horizontal" Tapped ="StackPanel_Tap_1">
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text=", "/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
</DataTemplate>
</Page.Resources>
<StackPanel>
<ItemsControl x:Name="listbox" ItemTemplate="{StaticResource dataTemplateDefaultKey }" ItemsSource="{Binding lstu}"/>
</StackPanel>
private void StackPanel_Tap_1(object sender, TappedRoutedEventArgs e)
{
student stu = (student)(sender as Panel).DataContext;
System.Diagnostics.Debug.WriteLine((sender as Panel).GetType().ToString());
System.Diagnostics.Debug.WriteLine(stu.LastName);
//sender是点击的item,sender as Panel获得该item内的容器对象,分别是StackPanel和Grid
// 然后从listbox里面获取到当前的ContentPresenter对象
ContentPresenter myContentPresenter = (ContentPresenter)(listbox.ContainerFromItem((sender as Panel).DataContext));
// 判断数据模板是选中状态的还是非选中状态的,然后进行赋值
if (myContentPresenter.ContentTemplate.Equals(dataTemplateSelectName))
{
//赋值非选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateNoSelectName;
}
else
{
//赋值选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateSelectName;
}
}
在这里还要注意一点的是,如果使用的时ListBox控件而不是ItemsControl控件的时候,在获取ContentPresenter对象的时候需要通过可视化树去查找。代码的实现如下所示:
private void StackPanel_Tap_1(object sender, TappedRoutedEventArgs e)
{
var s=(sender as Panel).DataContext;
//System.Diagnostics.Debug.WriteLine((sender as Panel).GetType().ToString());
//System.Diagnostics.Debug.WriteLine(stu.LastName);
// 通过点击的控件的DataContext判断所绑定的数据对象
// 然后从listbox里面获取到当前的ContentPresenter对象
ListBoxItem myListBoxItem = (ListBoxItem)(listbox.ContainerFromItem((sender as Panel).DataContext));
// 判断数据模板是选中状态的还是非选中状态的,然后进行赋值
// 在ListBoxItem中查找ContentPresenter
ContentPresenter myContentPresenter=(ContentPresenter)FindVisualChild<ContentPresenter>(myListBoxItem);
if (myContentPresenter.ContentTemplate.Equals(dataTemplateSelectName))
{
//赋值非选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateNoSelectName;
}
else
{
//赋值选中状态的模板
myContentPresenter.ContentTemplate = dataTemplateSelectName;
}
}
//查找可视化树某个类型的元素
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
return (childItem)child;
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
设置itemcontrol的item点击前后不同状态的更多相关文章
- Android ListView的item背景色设置以及item点击无响应等相关问题
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的ite ...
- Android Material适配 为控件设置指定背景色和点击波纹效果
Android Material适配 为控件设置指定背景色和点击波纹效果,有需要的朋友可以参考下. 大部分时候,我们都需要为控件设置指定背景色和点击效果 4.x以下可以使用selector,5.0以上 ...
- android 项目学习随笔十三(ListView实现ITEM点击事件,将已读状态持久化到本地)
1.因为给LISTVIEW增加了两个头布局,所以在点击事件ITEM索引会增加2,比如原来第一条数据的索引应该为0,增加两个头布局后,它的索引变为 2,为了使LISTVIEW的ITEM在点 ...
- Android GridView 第一个Item 点击没反应
@Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHo ...
- listview 嵌套checkbox响应item点击和button点击事件
参考文档 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=182280 一.主要要点 1. CheckBox的优先级比item高. ...
- Android设置常见控件点击效果
一. Imageview的点击效果——图片稍微变暗突出点击效果 public class ClickImageView extends AppCompatImageView { public Clic ...
- 设置ListView的item多选
一,首先定义一个类来关联Adapter和Activity能够记住点击的位置 public class MyViewHoler{ public CheckBox cb; public TextView ...
- 从源码角度入手实现RecyclerView的Item点击事件
RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是 ...
- Android ListView中Item点击事件失效解决方案
欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布 ...
随机推荐
- 防火墙---iptables
一.iptables的说明及环境安装 (1)理论基础:当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或 ...
- django2中文界面
设置了中文语言 zh-hans后,django2默认页面是中文的. 看起来也不错哦. 创建django2超级管理员: createsuperuser 创建管理员后,就可以登录后台了. 注册用户user ...
- BASE理论
BASE是Basiclly Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)三个短语的缩写. BASE是对CAP中一致性和可用性 ...
- pip安装tensorflow出错怎么办
随着人工智能的开发越来越多人参与,现在下载tensorflow 1.2版本也经常出错了,如下: 这时怎么办呢? 其实比较简单,可以通过pypi的网站来下载: https://pypi.python.o ...
- iOS开发之如何在Xcode中显示断点堆栈
昨天有人问我在Xcode中打断点后怎么查看堆栈,今天就简单的聊聊. 首先解释一下,什么是堆栈? 堆:顺序随意:栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式 ...
- 类的静态方法@staticmethod
静态方法 @staticmethod 静态方法是定义在类内部的函数,此函数的作用域是类的内部 说明: 静态方法需要使用 @staticmethod装饰器定义 静态方法与普通函数定义相同,不需要传入se ...
- 求整数A和B的二进制表示中有多少位是不同?
如果有题目要求整数A和B二进制表示中多少位是不同的? 那我们要先考虑一个unsigned类型中变量1的个数?我们可以考虑简单的移位运算,向右移位,我们进行判断如果不是1直接丢掉,使用&运算符即 ...
- LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】
LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...
- C#/.NET 读取或修改文件的创建时间和修改时间
手工在博客中添加 Front Matter 文件头可是个相当费事儿的做法,这种事情就应该自动完成. .NET 中提供了非常方便的修改文件创建时间的方法,使用这种方法,能够帮助自动完成一部分文件头的编写 ...
- 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
原文: http://www.cnblogs.com/pengdonglin137/p/3345911.html