WP8.1 侧边滑动Item
效果图

我看ios 和安卓上有好多类似的Item的效果,UWP上有微软官方的库,其中也有类似得效果,看样子WP8.1没有啊,顺便我的程序也是需要,我也就仿了一个。
具体思路是: 触摸控制GRId在CANvas的相对位置。滑动这个Item时候,其他已经滑动完成的ITEM关闭。只能有一个打开。
实现这个效果,至少需要以下知识点:
Canvsa基础知识
触控基础知识
ObservableCollection<T>基本使用
INotifyPropertyChanged接口基本使用
咱也不罗嗦 开始
先上xaml代码
<ListView x:Name="listView" SelectionChanged="listView_SelectionChanged" >
<ListView.ItemTemplate>
<DataTemplate>
<!--几个关键触控设置-->
<!--ManipulationCompleted="X1_ManipulationCompleted" ManipulationDelta="X1_ManipulationDelta" ManipulationStarted="X1_ManipulationStarted" ManipulationMode="TranslateX,System" -->
<Grid ManipulationCompleted="X1_ManipulationCompleted" ManipulationDelta="X1_ManipulationDelta" ManipulationStarted="X1_ManipulationStarted" ManipulationMode="TranslateX,System" Height="" Width="{Binding ItemWidth}">
<!--关键的底板,Canvsa-->
<Canvas x:Name="C1">
<!--对其主体Gird的Canvsa.Left绑定-->
<!--Canvas.Left="{Binding CanvsaLeft, Mode=TwoWay}"-->
<Grid Canvas.Left="{Binding CanvsaLeft, Mode=TwoWay}" x:Name="G1" Height="" Width="">
<!--分块,一块是屏幕的显示,一个在隐藏着中-->
<!--屏幕这一块,可以用Binding绑定,另一个随意了 看心情,不过这也和Canvsa.left大小也有关心-->
<Grid.ColumnDefinitions>
<ColumnDefinition Width="450*"/>
<ColumnDefinition Width="130*"/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="73*"/>
<RowDefinition Height="70*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="28*"/>
<ColumnDefinition Width="47*"/>
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding ImageName}" FontSize="" Grid.ColumnSpan="" Margin="168,10,0,0.333"/>
<TextBlock Text="{Binding ImageAge}" FontSize="" Grid.ColumnSpan="" Grid.Row="" Margin="168,10,0,0.333"/>
<Image Source="TOPImage/ops.png" Grid.Column="" Grid.RowSpan="" Margin=""/>
</Grid>
<Grid Grid.Column="" >
<Border BorderThickness="1,0,0,0">
<Border.BorderBrush>
<SolidColorBrush Color="Black"/>
</Border.BorderBrush>
<Image Source="IcoImage/del.png" />
</Border>
</Grid>
</Grid>
</Canvas>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
ObservableCollection<T>+INotifyPropertyChanged接口的代码:
public class ReadDataList
{
private ObservableCollection<DataList> setData = new ObservableCollection<DataList>(); public ObservableCollection<DataList> GetData()
{
return setData;
} }
public class DataList : INotifyPropertyChanged//变化接口,通知UI
{
private double Nub; public string ImageName { get; set; }
public string ImageAge { get; set; }
public double ItemWidth //绑定手机具体的宽度
{
get
{
return Window.Current.Bounds.Width;
}
}
public ImageSource imageSourec { get; set; }
public double CanvsaLeft //滑动的基础,就是对Canvsa的相对位置的处理
{
get
{
return Nub;
}
set
{
Nub = value;
OnChanged(new PropertyChangedEventArgs("CanvsaLeft"));
} } public int ItemCount { get; set; } public event PropertyChangedEventHandler PropertyChanged;
protected void OnChanged(PropertyChangedEventArgs arg)//具体方法
{
if (PropertyChanged != null)
{
PropertyChanged(this, arg);
}
}
}
对屏幕滑动的处理代码:
private void X1_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)//手在屏幕移动方法
{
P2 = e.Cumulative.Translation; //触摸点结束位置
if (P2.X < P1.X && (Canvas.GetLeft(G1) != -))//X轴的判断,向左滑动,且Item的初始Canvsa的相对位置不能大于-130
{
if (Canvas.GetLeft(G1) >= -)
{
Canvas.SetLeft(G1, P2.X++);
} }
if (P2.X < P1.X)//滑动结束或者滑动中
{
if (Canvas.GetLeft(G1) < -)
{
Canvas.SetLeft(G1, -);
} }
if (P2.X > P1.X)//向右滑动,返回ITEM 一下子回去 这块的代码不是很好 带我优化优化把
{ if (Canvas.GetLeft(G1) < )
{
Canvas.SetLeft(G1, Canvas.GetLeft(G1) + P2.X);
} }
if (P2.X > P1.X)//向右滑动,返回Item 滑动中
{
if (Canvas.GetLeft(G1) > )
{
Canvas.SetLeft(G1, );
}
} e.Handled = true;//结束这段代码
P1.X = ;//清空
P2.X = ;//清空 } private void X1_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e) //触摸开始
{
G1 = ((Grid)sender).FindName("G1") as Grid;//确定触摸事件源头(具体Item) P1 = e.Position;//触摸点的起点位置 } private void X1_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)//手离开屏幕
{ if (Canvas.GetLeft(G1) > -)//判断向左滑动途中手是否离开屏幕,离开屏幕时Item的位置 以此判断 小于一般 回到0 大于一半到结束位置
{
Canvas.SetLeft(G1, ); }
if ((Canvas.GetLeft(G1) < -))
{
Canvas.SetLeft(G1, -);
OneItemData = (e.OriginalSource as FrameworkElement).DataContext as DataList;//确定滑动的Item
SetCanvas(OneItemData);//判断其他Item是否打开的方法 } } void SetCanvas(object sender)//判断再滑动Item时是否已经有其他Item已经滑动完成,有就关闭。
{
var data= sender as DataList; //现在正在滑动的ITEM
for (int i = ; GetAllData.Count> i; i++)//datalist全部的集合
{
if (GetAllData[i].CanvsaLeft == -&&GetAllData[i].ItemCount!=data.ItemCount)//判断其中元素的CANvas元素是否位-130,同时确保这个元素不是正在滑动的元素
{
GetAllData[i].CanvsaLeft = ;//是就将Canvas.left的相对位置=0
}
} }
WP8.1 侧边滑动Item的更多相关文章
- SlideAndDragListView,一个可排序可滑动item的ListView
SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示"菜单"的ListView. SlideAndDragListVi ...
- Android开发 侧边滑动菜单栏SlidingMenu结合Fragment
SlidingMenu是一个开源项目, https://github.com/jfeinstein10/SlidingMenu .功能是创建侧边滑动菜单栏,效果类似人人Android客户端,可点击按钮 ...
- Android SlideAndDragListView,一个可排序可滑动item的ListView
SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示”菜单”的ListView. SlideAndDragListView(SDLV)继承 ...
- 关于recycleview 滑动item变长(item变形)问题
昨天在做项目的时候出现了bug,表现是在滑动的时候,整个item会被拉长了,松手后就回归正常大小了, 出现这个的主要原因是因为你的item布局中最大的那个根布局是 match_parent状态,因此导 ...
- html5手机端的点击弹出侧边滑动菜单代码
效果预览:http://hovertree.com/texiao/html5/19/ 本效果适用于移动设备,可以使用手机等浏览效果. 源码下载:http://hovertree.com/h/bjaf/ ...
- 【WP8】ScrollViewer滑动到底触发器(ListBox失效)
很多时候会有到底加载更多的需求,而ScrollViewer不支持继承,无法继承它进行扩展,只能通过触发器来控制到底的事件(当然,可以通过UserControl去扩展) 思路:定义一个Trigger,自 ...
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...
- Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item
1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...
- Android 滑动菜单框架--SwipeMenuListView框架完全解析
SwipeMenuListView(滑动菜单) A swipe menu for ListView.--一个非常好的滑动菜单开源项目. Demo 一.简介 看了挺长时间的自定义View和事件分发,想找 ...
随机推荐
- [BI项目记]-搭建代码管理环境之服务端
上一篇介绍如何搭建环境进行文档版本的管理,这篇主要介绍搭建环境进行代码版本的管理. 即使是BI项目也要进行代码版本管理.代码版本管理的工具有很多,VSS, SVN等都是当下大家经常提起的,这里主要介绍 ...
- Java 8相关
语言生态系统中的所有语言都有优胜劣汰的压力.虽然Java语言当前还在健康发展,但是保不定哪天就完蛋了. Java8增加的新特性从根本上来说是为了提高搬砖的姿势和效率. 多核编程的更好支持. 方法成为一 ...
- 【leetcode】Evaluate Reverse Polish Notation
Evaluate Reverse Polish Notation 题目描述: Evaluate the value of an arithmetic expression in Reverse Pol ...
- Asp.Net MVC4 + Oracle + EasyUI 学习 第二章
Asp.Net MVC4 + Oracle + EasyUI 第二章 --使用Ajax提升网站性能 本文链接:http://www.cnblogs.com/likeli/p/4236723.html ...
- Could not open Selected VM debug port (8700) (转)
Could not open Selected VM debug port (8700) 2014年11月14日 ⁄ 综合 ⁄ 共 446字 ⁄ 字号 小 中 大 ⁄ 评论关闭 在运行项目的时候, ...
- TreeView checkbox 全选
在使用TreeView 控件 ,进行权限管理的时候,需要使用 checkbox全选. 勾选父节点,子节点全部选中.取消父节点,子节点不选中. 勾选子节点,父节点也选中. 以下是在使用的例子: < ...
- HTML5编码规范
为每个 HTML 页面的第一行添加标准模式(standard mode)的声明,这样能够确保在每个浏览器中拥有一致的展现. 用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展 ...
- 如何自定义jupyter notebook的主题
临时性的改变一个jupyter的主题 参考这个实现,只要在notebook里运行这段代码就行了,能让所有的cell都能够显示黑色背景 一个更为完备的工具 参考这个方案: 安装jupyter-theme ...
- EasyAR 开发教程系列1--小试牛刀
大家好,我是Albert Lee(@Mars Studio),AR独立开发者.计算机视觉与人工智能研究者. AR 开发资源汇总(不断更新中):https://github.com/GeekLiB 微信 ...
- 关于jqgrid数据不显示问题
近日有个需求要用到jqgrid,原本用着一切都很顺利,但是在需求变动后,只是修改部分字段名称jqgrid就不显示数据了,后台数据也能传到前台,但是就是不给我显示,到嘴的肉就是没法吃,蛋疼,郁闷都无法形 ...