在本实例中我们将从ListBox中拖出一个图标到另外一个ListBox中,这是一个比较有用的小功能,在这里我们首先来看运行效果(点击下面的图片即可拖动左边的图标到右边的ListBox中去)。
在线演示
实现过程是:1、我们把这个过程分为鼠标左键点击到左边的图标,使用Image_MouseLeftButtonDown事件。(设置一个标识符,标示当前已经被鼠标点击下去)
2、点击到这个图标不放,在整个Canvas内移动,使用LayoutRoot_MouseMove事件(此时设置一个图标跟随鼠标的位置移动,这个图标既是被点击的图标)。
3、当鼠标移动到右边的ListBox范围之内时放开鼠标左键,使用LayoutRoot_MouseLeftButtonUp事件(当鼠标左键弹起的时候,判断标识符是否为true,如果是的话表示有图标被拖动,并且判断此时的鼠标位置是否在右边的ListBox范围之内,如果是则将被拖动的图标放入右边的ListBox中)
首先我们添加8张图片素材,然后编写一个类来获取图片列表,其CS代码如下:
public class IphoneIco
{
#region 字段
string icoName;
BitmapImage icoImage;
#endregion
#region 属性
/// <summary>
/// 图标名称
/// </summary>
public string IcoName
{
get { return icoName; }
set { icoName = value; }
}
/// <summary>
/// 图标图像
/// </summary>
public BitmapImage IcoImage
{
get { return icoImage; }
set { icoImage = value; }
}
#endregion
#region 单一实例
public static readonly IphoneIco instance = new IphoneIco();
#endregion
#region 公共方法
public List<IphoneIco> getIphoneIcoList()
{
List<IphoneIco> iphoneIcoList = new List<IphoneIco>()
{
new IphoneIco(){ IcoName="1", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/1.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="2", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/2.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="3", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/3.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="4", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/4.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="5", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/5.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="6", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/6.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="7", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/7.png",UriKind.RelativeOrAbsolute))},
new IphoneIco(){ IcoName="8", IcoImage=new BitmapImage(new Uri("/SL5Drag;component/Images/8.png",UriKind.RelativeOrAbsolute))}
};
return iphoneIcoList;
}
#endregion
}
然后我们来看MainPage.xaml中的代码,向其中添加两个ListBox以及Image图标,其代码如下:
<UserControl x:Class="SL5Drag.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="400" d:DesignWidth="500">
<!--这个Canvas中有鼠标左键弹起事件,以及鼠标移动事件-->
<Canvas x:Name="LayoutRoot" AllowDrop="True"
MouseLeftButtonUp="LayoutRoot_MouseLeftButtonUp"
MouseMove="LayoutRoot_MouseMove">
<!--这个是右边的ListBox,鼠标拖动的图标在这个ListBox范围内放开-->
<ListBox Margin="400 0 0 0" Background="AliceBlue" Height="400"
HorizontalAlignment="Right" Name="listBox2"
VerticalAlignment="Top" Width="50" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="40" Height="40">
<Border BorderThickness="1">
<Image Source="{Binding IcoImage}" Width="30"
Height="30" Margin="0,5,6,0"
Tag="{Binding IcoName}"
HorizontalAlignment="Center" />
</Border>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--这个是左边的ListBox,鼠标将从此ListBox拖出图标-->
<ListBox Name="listBox1" Background="AliceBlue" Width="50"
HorizontalAlignment="Left" VerticalAlignment="Top"
Height="400" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="40" Height="40">
<Border BorderThickness="1">
<Image Source="{Binding IcoImage}" Width="30"
Height="30" Margin="0,5,6,0"
Tag="{Binding IcoName}"
MouseLeftButtonDown="Image_MouseLeftButtonDown"
HorizontalAlignment="Center" />
</Border>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<!--这个在鼠标拖动过程中显示的图标-->
<Image Name="Img" Opacity="0.5" Width="30" Height="30"
Margin="0,5,6,0" Visibility="Collapsed" HorizontalAlignment="Center" />
</Canvas>
</UserControl>
最后我们来看MainPage.xaml.cs代码,其中有相关的逻辑控制在注释中已注明:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Interactivity;
using Microsoft.Expression.Interactivity;
using Microsoft.Expression.Interactivity.Layout;
using System.Windows.Media.Imaging;
using System.ComponentModel;
namespace SL5Drag
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
//设置左边的ListBox显示的内容项
this.listBox1.ItemsSource = IphoneIco.instance.getIphoneIcoList();
string s = string.Empty;
}
List<IphoneIco> iphoneList;
/// <summary>
/// 标示是否按下鼠标左键
/// </summary>
bool leftMouseflag = false;
/// <summary>
/// 右边ListBox的结果集合
/// </summary>
private static List<IphoneIco> AddiphoneList = new List<IphoneIco>();
/// <summary>
/// 左边ListBox的结果集合
/// </summary>
public List<IphoneIco> IphoneList
{
get { return iphoneList; }
set { iphoneList = value; }
}
private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
//鼠标在ListBox中按下准备拖出图片的时候,设置leftMouseflag为true,并且设置Image为可见
leftMouseflag = true;
Image image=sender as Image;
this.Img.Source = image.Source;
Point point = e.GetPosition(null);
this.Img.SetValue(Canvas.LeftProperty, point.X );
this.Img.SetValue(Canvas.TopProperty, point.Y - 5.0);
this.Img.Visibility = Visibility.Visible;
}
private void LayoutRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
//如果得知鼠标左键松动的位置是右边的ListBox上时则为右边的ListBox添加一列
Point point =e.GetPosition(null);
if (point.X > 400 && point.X < 450 && point.Y < 400&& leftMouseflag == true )
{
BitmapImage bimg = this.Img.Source as BitmapImage;
this.Img.Visibility = Visibility.Collapsed;
AddiphoneList.Add(new IphoneIco()
{
IcoName = "2",
IcoImage = bimg
});
this.listBox2.ItemsSource = null;
this.listBox2.ItemsSource = AddiphoneList;
}
else
{
this.Img.Visibility = Visibility.Collapsed;
this.Img.Source = null;
}
leftMouseflag = false;
}
private void LayoutRoot_MouseMove(object sender, MouseEventArgs e)
{
//让图片跟随鼠标的移动而移动
Point point = e.GetPosition(null);
this.Img.SetValue(Canvas.LeftProperty, point.X);
this.Img.SetValue(Canvas.TopProperty, point.Y-5.0);
}
}
}