|
- using Microsoft.Toolkit.Mvvm.ComponentModel;
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Controls.Primitives;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Effects;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
-
- namespace WPFDemo
- {
- /// <summary>
- /// fyf 创建测试案例
- /// TheListBox.xaml 的交互逻辑
- /// </summary>
- public partial class TheListBox : UserControl
- {
- /// <summary>
- /// 数据model
- /// </summary>
- public ListBoxDataModel TheListBoxModel = new ListBoxDataModel();
- public TheListBox()
- {
- InitializeComponent();
- this.DataContext = TheListBoxModel;
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "张三", Ph = "125486545" });
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "李四", Ph = "125486545" });
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "王麻子", Ph = "125486545" });
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "二货", Ph = "125486545" });
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "张三1", Ph = "125486545" });
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "李四2", Ph = "125486545" });
- TheListBoxModel.ViewItems.Add(new ItemModel { Name = "王麻子3", Ph = "125486545" });
- }
- #region 移动事件
- /// <summary>
- /// 当前拖动子控件流
- /// </summary>
- private UIElement ChildElement;
- /// <summary>
- /// 当前拖拽子控件Item
- /// </summary>
- private ListBoxItem ChildListBoxItem;
- /// <summary>
- /// 是否已经按下
- /// </summary>
- private bool isDown = false;
- /// <summary>
- /// 当前拖动的Pop窗体
- /// </summary>
- private Popup DropPopup = null;
- /// <summary>
- /// 鼠标按下事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
- {
- try
- {
- //isDown变量是防止多次操作。
- if (isDown)
- {
- isDown = false;
- return;
- }
-
- ChildElement = (UIElement)sender;
- ChildElement.CaptureMouse();//设置了鼠标捕获,这样它可以不受到其它控件的影响。
- ChildListBoxItem = Utils.FindVisualParent<ListBoxItem>(VisualTreeHelper.HitTest(ChildElement, e.GetPosition(ChildElement)).VisualHit);
-
- //创建一个Pop,表明拖拽开始
- CreatePopup(ChildElement, e);
-
- isDown = true;
- }
- catch (Exception ex)
- {
-
- }
- }
- /// <summary>
- /// 鼠标抬起事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void lisbox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
- {
- try
- {
- //鼠标未按下返回
- if (!isDown) return;
-
- isDown = false;
-
- //关闭Pop窗体
- if (this.DropPopup != null)
- {
- this.DropPopup.IsOpen = false;
- this.DropPopup.Child = null;
- this.DropPopup = null;
- }
-
- //蒙层关闭,表明结束拖拽
- MoveListBoxStyle(null, false);
-
- //当控件具有鼠标捕获的话,则释放该捕获。
- ChildElement.ReleaseMouseCapture();
- }
- catch (Exception ex)
- {
-
- }
- }
- /// <summary>
- /// 鼠标移动事件
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void ListView_PreviewMouseMove(object sender, MouseEventArgs e)
- {
- try
- {
- if (isDown == false) return;
-
- if (e.LeftButton != MouseButtonState.Pressed)
- lisbox_PreviewMouseLeftButtonUp(null, null);
-
- Point ptLeftUp = new Point(0, 0);
- Point ptRightDown = new Point(this.ActualWidth, this.ActualHeight);
-
- ptLeftUp = this.PointToScreen(ptLeftUp);
- ptRightDown = this.PointToScreen(ptRightDown);
-
- double y = e.GetPosition(this).Y;
- double x = e.GetPosition(this).X;
-
- if (DropPopup != null)//下面两句是设置Popup控件的位置除以2是想让鼠标在它的中心
- {
- DropPopup.HorizontalOffset = ptLeftUp.X + x - ((FrameworkElement)ChildElement).ActualWidth / 2;
- DropPopup.VerticalOffset = ptLeftUp.Y + y - ((FrameworkElement)ChildElement).ActualHeight / 2;
- }
-
- //蒙层打开,表明拖拽开始,设置透明度和显示状态
- MoveListBoxStyle(e, true);
- }
- catch (Exception ex)
- {
- }
- }
- /// <summary>
- /// 移动效果
- /// </summary>
- /// <param name="boxItem"></param>
- private void MoveListBoxStyle(MouseEventArgs e, bool isBool)
- {
- try
- {
- if (isBool)//为真,根据鼠标位置设置行透明度和显示状态
- {
- //移动到某行减轻某行 暗黑
- foreach (ListBoxItem item in Utils.FindVisualChildren<ListBoxItem>(listView))
- {
- if (item != ChildListBoxItem)//这就是其他控件
- {
- double item_width = item.ActualWidth; //当前行宽
- double item_height = item.ActualHeight; //当前行高
- double item_x = e.GetPosition(item).X; //鼠标相对当前行X位移
- double item_y = e.GetPosition(item).Y; //鼠标相对当前行Y位移
-
- if (item_y <= item_height && item_y > 0 && item_x > 0 && item_x <= item_width)//鼠标进入哪一行,则将那一行变灰
- {
- item.Opacity = 0.5;
- int lao_index = TheListBoxModel.ViewItems.IndexOf(item.Content as ItemModel);
- int new_index = TheListBoxModel.ViewItems.IndexOf(ChildListBoxItem.Content as ItemModel);
- TheListBoxModel.ViewItems.Move(lao_index, new_index);
- }
- else //鼠标没在哪一行,则保持原状
- {
- item.Opacity = 1;
- }
- }
- else
- {
- item.Visibility = Visibility.Hidden;
- }
- }
- }
- else//为假 恢复所有行透明度和显示状态
- {
- //移动到某行减轻某行 暗黑
- foreach (ListBoxItem item in Utils.FindVisualChildren<ListBoxItem>(listView))
- {
- item.Opacity = 1;
- item.Visibility = Visibility.Visible;
- }
- }
- }
- catch (Exception ex)
- {
- }
- }
- /// <summary>
- /// 创建浮动窗口
- /// </summary>
- /// <param name="dragElement"></param>
- /// <param name="e"></param>
- private void CreatePopup(Visual dragElement, MouseButtonEventArgs e)
- {
- //使用PointToScreen函数可以将点转换为屏幕坐标
- //首先获取当前窗体的左上角和右下角两点的坐标
- Point ptLeftUp = new Point(0, 0);
- //转换获取到这个窗口相对于屏幕两个坐标
- ptLeftUp = this.PointToScreen(ptLeftUp);
- //获取myGrid的实际宽高,主
- double y = e.GetPosition(this).Y;
- double x = e.GetPosition(this).X;
-
- //拖拽Popup框
- this.DropPopup = new Popup();
- Border border = new Border();
- border.Margin = new Thickness(0, 0, 8, 8);
- DropShadowEffect effect = new DropShadowEffect();
- effect.Opacity = 1;
- effect.ShadowDepth = -14;
- effect.BlurRadius = 9;
- effect.Color = Color.FromArgb(100, 0, 0, 0);
- border.Effect = effect;
-
- //矩阵框
- Rectangle r = new Rectangle();
- r.Width = ((FrameworkElement)dragElement).ActualWidth;
- r.Height = ((FrameworkElement)dragElement).ActualHeight;
- r.Fill = new VisualBrush(dragElement);
- border.Child = r;
- this.DropPopup.Child = border;
- DropPopup.AllowsTransparency = true;
- DropPopup.HorizontalOffset = ptLeftUp.X + x - ((FrameworkElement)dragElement).ActualWidth / 2;
- DropPopup.VerticalOffset = ptLeftUp.Y + y - ((FrameworkElement)dragElement).ActualHeight / 2;
- this.DropPopup.IsOpen = true;
- }
- #endregion
-
- }
- /// <summary>
- /// 当前项数据Model
- /// </summary>
- public class ListBoxDataModel : ObservableObject
- {
- private ObservableCollection<ItemModel> _ViewItems;
- public ObservableCollection<ItemModel> ViewItems
- {
- get
- {
- return _ViewItems;
- }
- set
- {
- _ViewItems = value;
- OnPropertyChanged("ViewItems");
- }
- }
- public ListBoxDataModel()
- {
- ViewItems = new ObservableCollection<ItemModel>();
- }
- }
- /// <summary>
- /// 行数据Model
- /// </summary>
- public class ItemModel : ObservableObject
- {
- private string _Name;
- public string Name
- {
- get
- {
- return _Name;
- }
- set
- {
- _Name = value;
- OnPropertyChanged("Name");
- }
- }
- private string _Ph;
- public string Ph
- {
- get
- {
- return _Ph;
- }
- set
- {
- _Ph = value;
- OnPropertyChanged("Ph");
- }
- }
- }
- /// <summary>
- /// 帮助类
- /// </summary>
- internal static class Utils
- {
- /// <summary>
- /// 根据子元素查找父元素
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="obj"></param>
- /// <returns></returns>
- public static T FindVisualParent<T>(DependencyObject obj) where T : class
- {
- while (obj != null)
- {
- if (obj is T)
- return obj as T;
-
- obj = VisualTreeHelper.GetParent(obj);
- }
- return null;
- }
- /// <summary>
- /// 查询子控件
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="obj"></param>
- /// <returns></returns>
- public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
- {
- if (depObj != null)
- {
- for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
- {
- DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
- if (child != null && child is T)
- {
- yield return (T)child;
- }
-
- foreach (T childOfChild in FindVisualChildren<T>(child))
- {
- yield return childOfChild;
- }
- }
- }
- }
- }
- }
|