效果图

我看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的更多相关文章

  1. SlideAndDragListView,一个可排序可滑动item的ListView

    SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示"菜单"的ListView. SlideAndDragListVi ...

  2. Android开发 侧边滑动菜单栏SlidingMenu结合Fragment

    SlidingMenu是一个开源项目, https://github.com/jfeinstein10/SlidingMenu .功能是创建侧边滑动菜单栏,效果类似人人Android客户端,可点击按钮 ...

  3. Android SlideAndDragListView,一个可排序可滑动item的ListView

    SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示”菜单”的ListView. SlideAndDragListView(SDLV)继承 ...

  4. 关于recycleview 滑动item变长(item变形)问题

    昨天在做项目的时候出现了bug,表现是在滑动的时候,整个item会被拉长了,松手后就回归正常大小了, 出现这个的主要原因是因为你的item布局中最大的那个根布局是 match_parent状态,因此导 ...

  5. html5手机端的点击弹出侧边滑动菜单代码

    效果预览:http://hovertree.com/texiao/html5/19/ 本效果适用于移动设备,可以使用手机等浏览效果. 源码下载:http://hovertree.com/h/bjaf/ ...

  6. 【WP8】ScrollViewer滑动到底触发器(ListBox失效)

    很多时候会有到底加载更多的需求,而ScrollViewer不支持继承,无法继承它进行扩展,只能通过触发器来控制到底的事件(当然,可以通过UserControl去扩展) 思路:定义一个Trigger,自 ...

  7. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  8. Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item

    1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...

  9. Android 滑动菜单框架--SwipeMenuListView框架完全解析

    SwipeMenuListView(滑动菜单) A swipe menu for ListView.--一个非常好的滑动菜单开源项目. Demo 一.简介 看了挺长时间的自定义View和事件分发,想找 ...

随机推荐

  1. 解决 eclipse中properties文件编码问题

    菜单——>Preferences——>General——>ContentTypes——>Text——>Java Properties File,设置Default enc ...

  2. quartz.net插件类库封装(含源码)

    1.前言 目录: 1.quartz.net任务调度:源码及使用文档 2.quartz.net插件类库封装 最近项目需要做一写任务作业调度的工作,最终选择了quartz.net这个插件,它提供了巨大的灵 ...

  3. Client病毒已感染超7万人 暗扣费并频弹广告

    恶意木马病毒横行,您的钱包还hold得住吗?猎豹移动安全实验室与安天AVL移动安全团队于2015年下半年,共同截获一款名为Client的木马病毒,并且对该病毒进行持续监测.通过进一步关注,我们发现该病 ...

  4. 对DIP IoC DI的理解与运用

    DIP,IoC,DI基本概念 依赖倒置原则(DIP,Dependency Inverse Principle):强调系统的“高层组件”不应当依赖于“底层组件”,并且不论是“高层组件”还是“底层组件”都 ...

  5. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  6. module_init的加载和释放

    转自:http://blog.csdn.net/dysh1985/article/details/7597105 像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件, ...

  7. 如何自定义jupyter notebook的主题

    临时性的改变一个jupyter的主题 参考这个实现,只要在notebook里运行这段代码就行了,能让所有的cell都能够显示黑色背景 一个更为完备的工具 参考这个方案: 安装jupyter-theme ...

  8. JS控制按钮不能连续被点击

    将下面代码拷贝进一个html文件中就可以运行查看效果. function downLoad(evt) { disabledButton(); MyPeriodicalExecuter(evt); } ...

  9. wenbenfenlei

    ICTCLAS: 该分词系统的主要思想是先通过CHMM(层叠形马尔可夫模型)进行分词,通过分层,既增加了分词的准确性,又保证了分词的效率.基本思路是:先进行原子切分,然后在此基础上进行N-最短路径粗切 ...

  10. Trie URAL 7192 Chip Factory (15长春J)

    题目传送门 题意:从n个数中选出不同的三个数a b c,使得(a+b)^c 最大 分析:先将所有数字按位插入到字典树上,然后删除两个数字,贪心询问与剩下的数字最大异或值. /************* ...