效果图

我看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. CombineStream 与 Multipart Form

    最近开始研究http 特别是multipart 表单,想弄明白他是怎么work 的.在nodejs 里,可以使用form-data 来组合一个multipart 表单,然后使用http.request ...

  2. WordPress安装插件提示输入FTP账户信息

    在WP后台安装插件时提示输入FTP账户信息,其实出现这个的问题的原因是Apache/Nginx的执行身份非文件属主身份. 如果你使用的是独立服务器或VPS,WordPress的安装目录为 /home/ ...

  3. js 一些容易错的点

    最近在做平台相关功能,需要和js.html.以及使用bootstrap,bootstrap元素大小的设置 是比较难的. js比较容易出错的是,解析json,对象最好是使用json,这样更好解析,arr ...

  4. javascript将object转string字符串

    var jsonData = {a:1,b:2}; function obj2string(o) { var r = []; if (typeof o == "string") { ...

  5. 深入分析@Transactional的用法

    关键词:事务, 编程式事务,声明式事务.spring 事务管理.AOP事务增强.@Transactional 在分析深入分析@Transactional的使用之前,我们先回顾一下事务的一些基本内容. ...

  6. JS 之Blob 对象类型

    原文 http://blog.csdn.net/oscar999/article/details/36373183 什么是Blob? Blob 是什么? 这里说的是一种Javascript的对象类型. ...

  7. SOAPUI使用教程-创建MockResponse步骤

    MockResponse测试步骤监听一个SOAP请求并返回一个预先配置的响应,然后再继续. 传入的请求的能被断言检查. 这种TestStep使用场景是例如: 客户端测试,验证传入的请求并返回假或不正确 ...

  8. 畅通工程[HDU1863]

    畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissio ...

  9. Web设计师值得收藏的10个jQuery特效

    jQuery已经不是什么新鲜的事儿,以前总把它认为是非常难的东西,也就没有认真去了解他了.直到学完CSS的大部分内容,才开始接触这种"write less, do more" 的J ...

  10. 阿里云分布式关系数据库DRDS笔记

    1.Join左边的表查询数据越少,性能越好 2.广播表作为Join的驱动表 3.SQL的Limit优化 SELECT * FROM t_order o WHERE o.id IN ( SELECT i ...