效果图

我看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. java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复 ...

  2. sublime text 3 使用方法

    1.Package Control 安装插件 2.Material Theme 主题 3.Emmet 自动HTML标签 4.Snippets JS自动片段 5.Advance newfile 文件夹下 ...

  3. TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之一

    Marionette牵线木偶,Backbone是脊骨的意思,Marionette是基于Backbone做扩展库,可以理解为把脊骨骨架绑线扯着变成牵线木偶动起来哈哈,使backbone更易使用呵呵! 构 ...

  4. CodeForces 520B Two Buttons(用BFS)

     Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  5. codeforces泛做..

    前面说点什么.. 为了完成日常积累,傻逼呵呵的我决定来一发codeforces 挑水题 泛做.. 嗯对,就是泛做.. 主要就是把codeforces Div.1的ABCD都尝试一下吧0.0.. 挖坑0 ...

  6. [BZOJ4029][HEOI2015] 定价

    Description 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很 ...

  7. Spark 架构

    本文转之Pivotal的一个工程师的博客.觉得极好.   作者本人经常在StackOverflow上回答一个关系Spark架构的问题,发现整个互联网都没有一篇文章能对Spark总体架构进行很好的描述, ...

  8. discuz sphinx全文检索搜索引擎方案

    基于discuz的索引配置文件,这个配置文件比较灵活,可以根据不同的需求来配置 # # linuxTone full index search configure file # source lt_p ...

  9. 立flag

    lixintong这半年来一直浪啊浪啊都不认真做题!!!!!!简直是太堕落啦!!lixintong非常讨厌这样的lixintong !!! 鉴于lixintong NOIP 完全爆炸啦! lixint ...

  10. java使用poi包将数据写入Excel表格

    1.Excel相关操作代码 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...