效果图

我看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. jquery获取不到append出来的新元素的解决办法

    jquery获取不到append出来的新元素的解决办法 $('body').on("click","property",function(){}) jq1.7+ ...

  2. Spring事务管理

    Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...

  3. 卸载 ibus 使Ubuntu16.04任务栏与启动器消失 问题解决

    经查证是unity误卸载了,我使用了命令: sudo apt-get remove --purge ibus 解决方法是: 使用以下命令:重置compiz: dconf reset -f /org/c ...

  4. github之git基本命令介绍的简单整理

    git 格式: git [--version] [--exec-path[=<path>]] [--html-path] [--info-path] [-p|--paginate|--no ...

  5. Codeforces Round #367 (Div. 2)

    A题 Beru-taxi 随便搞搞.. #include <cstdio> #include <cmath> using namespace std; int a,b,n; s ...

  6. Android的5大组件

    1. Activity组件 Activity组件通常的表现形式是一个单独的界面(screen).每个Activity都是一个单独的类,它扩展实现了Activity基础类.这个类显示为一个由Views组 ...

  7. div垂直居中的几种方法

    CSS教程:div垂直居中的N种方法[转](原文地址:http://www.cnblogs.com/chuncn/archive/2008/10/09/1307321.html) 在说到这个问题的时候 ...

  8. Glyphicon 字体图标

    Bootstrap中的Glyphicon 字体图标 在Bootstrap框架中也为大家提供了近200个不同的icon图片,而这些图标都是使用CSS3的@font-face属性配合字体来实现的icon效 ...

  9. About_类与对象

    所谓类,就是把具有相同行为,特征的归为一类: 1)什么是面向对象: 起初,“面向对象”是专指在程序设计中采用封装.继承.抽象等设计方法.可是,这个定义显然不能再适合现在情况.面向对象的思想已经涉及到软 ...

  10. git revert和git reset的区别

    git revert 是撤销某次操作,此次操作之前的commit都会被保留 git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区 具体一个例子,假设有三个commit, git s ...