diff --git a/WPFDemo/TheListBox.xaml b/WPFDemo/TheListBox.xaml new file mode 100644 index 00000000..2c6eddc9 --- /dev/null +++ b/WPFDemo/TheListBox.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + diff --git a/WPFDemo/TheListBox.xaml.cs b/WPFDemo/TheListBox.xaml.cs new file mode 100644 index 00000000..a95547a4 --- /dev/null +++ b/WPFDemo/TheListBox.xaml.cs @@ -0,0 +1,356 @@ +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 +{ + /// + /// fyf 创建测试案例 + /// TheListBox.xaml 的交互逻辑 + /// + public partial class TheListBox : UserControl + { + /// + /// 数据model + /// + 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 移动事件 + /// + /// 当前拖动子控件流 + /// + private UIElement ChildElement; + /// + /// 当前拖拽子控件Item + /// + private ListBoxItem ChildListBoxItem; + /// + /// 是否已经按下 + /// + private bool isDown = false; + /// + /// 当前拖动的Pop窗体 + /// + private Popup DropPopup = null; + /// + /// 鼠标按下事件 + /// + /// + /// + private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + try + { + //isDown变量是防止多次操作。 + if (isDown) + { + isDown = false; + return; + } + + ChildElement = (UIElement)sender; + ChildElement.CaptureMouse();//设置了鼠标捕获,这样它可以不受到其它控件的影响。 + ChildListBoxItem = Utils.FindVisualParent(VisualTreeHelper.HitTest(ChildElement, e.GetPosition(ChildElement)).VisualHit); + + //创建一个Pop,表明拖拽开始 + CreatePopup(ChildElement, e); + + isDown = true; + } + catch (Exception ex) + { + + } + } + /// + /// 鼠标抬起事件 + /// + /// + /// + 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) + { + + } + } + /// + /// 鼠标移动事件 + /// + /// + /// + 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) + { + } + } + /// + /// 移动效果 + /// + /// + private void MoveListBoxStyle(MouseEventArgs e,bool isBool) + { + try + { + if (isBool)//为真,根据鼠标位置设置行透明度和显示状态 + { + //移动到某行减轻某行 暗黑 + foreach (ListBoxItem item in Utils.FindVisualChildren(listView)) + { + if (item != ChildListBoxItem)//这就是其他控件 + { + double item_width = item.ActualWidth; + double item_height = item.ActualHeight; + double item_x = e.GetPosition(item).X; + double item_y = e.GetPosition(item).Y; + double Child_x = e.GetPosition(ChildElement).X; + double Child_y = e.GetPosition(ChildElement).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(listView)) + { + item.Opacity = 1; + item.Visibility = Visibility.Visible; + } + } + } + catch (Exception ex) + { + } + } + /// + /// 创建浮动窗口 + /// + /// + /// + 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 + } + /// + /// 当前项数据Model + /// + public class ListBoxDataModel : ObservableObject + { + private ObservableCollection _ViewItems; + public ObservableCollection ViewItems + { + get + { + return _ViewItems; + } + set + { + _ViewItems = value; + OnPropertyChanged("ViewItems"); + } + } + public ListBoxDataModel() + { + ViewItems = new ObservableCollection(); + } + } + /// + /// 行数据Model + /// + 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"); + } + } + } + /// + /// 帮助类 + /// + internal static class Utils + { + /// + /// 根据子元素查找父元素 + /// + /// + /// + /// + public static T FindVisualParent(DependencyObject obj) where T : class + { + while (obj != null) + { + if (obj is T) + return obj as T; + + obj = VisualTreeHelper.GetParent(obj); + } + return null; + } + /// + /// 查询子控件 + /// + /// + /// + /// + public static IEnumerable FindVisualChildren(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(child)) + { + yield return childOfChild; + } + } + } + } + } +} diff --git a/WPFDemo/Window2.xaml b/WPFDemo/Window2.xaml index 40f394a0..797d065b 100644 --- a/WPFDemo/Window2.xaml +++ b/WPFDemo/Window2.xaml @@ -10,29 +10,10 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + diff --git a/WPFDemo/Window2.xaml.cs b/WPFDemo/Window2.xaml.cs index ec78fc3b..530ef240 100644 --- a/WPFDemo/Window2.xaml.cs +++ b/WPFDemo/Window2.xaml.cs @@ -23,307 +23,9 @@ namespace WPFDemo /// public partial class Window2 : Window { - TestModel testModel=new TestModel(); public Window2() { InitializeComponent(); - this.DataContext = testModel; - - - testModel.ViewItems.Add(new PageModel {Name="张三", Ph="125486545" }); - testModel.ViewItems.Add(new PageModel { Name = "李四", Ph = "125486545" }); - testModel.ViewItems.Add(new PageModel { Name = "王麻子", Ph = "125486545" }); - testModel.ViewItems.Add(new PageModel { Name = "二货", Ph = "125486545" }); - } - - #region 移动事件 - /// - /// 当前拖动子控件流 - /// - private UIElement ChildElement; - /// - /// 是否已经按下 - /// - private bool isDown = false; - /// - /// 按下记录初始鼠标点位 - /// 鼠标相对与拖动子控件的位置(偏移量) - /// - private Point InitPoint; - /// - /// 当前拖动的Pop窗体 - /// - private Popup DropPopup = null; - - - /// - /// 鼠标按下事件 - /// - /// - /// - private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - try - { - //isDown变量是防止多次操作。 - if (isDown) - { - isDown = false; - return; - } - - ChildElement = (UIElement)sender; - ChildElement.CaptureMouse();//设置了鼠标捕获,这样它可以不受到其它控件的影响。 - - InitPoint= new Point(e.GetPosition(ChildElement).X, e.GetPosition(ChildElement).Y); - - //加蒙层,表明已经开始拖动 - //暂时未加 - - CreatePopup(ChildElement, e); - - isDown = true; - } - catch (Exception ex) - { - - } } - /// - /// 鼠标抬起事件 - /// - /// - /// - 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; - } - - //蒙层关闭 - - ChildElement.ReleaseMouseCapture();//当控件具有鼠标捕获的话,则释放该捕获。 - - //double y = e.GetPosition(this).Y;//获取鼠标抬起时的控件的位置 Y值 - //double start = 0.0; - //int row = 0; - //foreach (RowDefinition rd in myGrid.RowDefinitions) - //{ - // start += rd.ActualHeight; - // if (y < start) - // { - // break; - // } - // row++; - //} - //double x = e.GetPosition(myGrid).X;//获取鼠标抬起时的控件的位置 X值 - //double cstart = 0.0; - //int column = 0; - //foreach (ColumnDefinition cd in myGrid.ColumnDefinitions) - //{ - // cstart += cd.ActualWidth; - // if (x < cstart) - // { - // break; - // } - // column++; - //} - //var initRow = Grid.GetRow(ultUE);//找到控件所在的行 - //var initCol = Grid.GetColumn(ultUE);//找到控件所在的列 - //UIElement uIElement = null; - //if (row != initRow || column != initCol) - //{ - // uIElement = GetChildren(myGrid, row, column); - //} - //if (uIElement != null) - //{ - // //下面是交换两个控件的位置 (需要先移除再加载) - // myGrid.Children.Remove(uIElement); - // Grid.SetColumn(ultUE, column);//指定控件在grid中哪行哪例 - // Grid.SetRow(ultUE, row); - // myGrid.Children.Add(uIElement); - // Grid.SetColumn(uIElement, initCol); - // Grid.SetRow(uIElement, initRow); - //} - } - catch (Exception ex) - { - - } - } - /// - /// 鼠标移动事件 - /// - /// - /// - private void ListView_PreviewMouseMove(object sender, MouseEventArgs e) - { - try - { - if (isDown == false) return; - - 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(lisbox).Y; - double x = e.GetPosition(lisbox).X; - - - if (DropPopup != null) - { - //下面两句是设置Popup控件的位置除以2是想让鼠标在它的中心 - DropPopup.HorizontalOffset = ptLeftUp.X + x - ((FrameworkElement)ChildElement).ActualWidth / 2; - DropPopup.VerticalOffset = ptLeftUp.Y + y - ((FrameworkElement)ChildElement).ActualHeight / 2; - } - - //double start = 0.0; - //int row = 0; - //foreach (RowDefinition rd in myGrid.RowDefinitions) - //{ - // start += rd.ActualHeight; - // if (y < start) - // { - // break; - // } - // row++; - //} - //double cstart = 0.0; - //int column = 0; - //foreach (ColumnDefinition cd in myGrid.ColumnDefinitions) - //{ - // cstart += cd.ActualWidth; - // if (x < cstart) - // { - // break; - // } - // column++; - //} - ////下面的代码是当鼠标移动到哪个格子哪个格子就会亮起来。 - //UIElement uIElement = GetChildren(myGrid, row, column); - //foreach (UIElement element in myGrid.Children) - //{ - // if (element != ultUE && element != uIElement) - // { - // element.Opacity = moveOpacity; - // } - // else - // { - // element.Opacity = 1; - // } - //} - } - catch (Exception ex) - { - - } - } - /// - /// 创建浮动窗口 - /// - /// - /// - 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; - - - 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 - } - - public class TestModel : ObservableObject - { - private ObservableCollection _pageModels; - public ObservableCollection ViewItems - { - get - { - return _pageModels; - } - set - { - _pageModels = value; - OnPropertyChanged("ViewItems"); - } - } - public TestModel() - { - ViewItems=new ObservableCollection(); - } - } - - public class PageModel : 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"); - } - } - } }