From e263082f0d441a09df11d9e7c65b107217b97da6 Mon Sep 17 00:00:00 2001 From: liufei Date: Fri, 8 Apr 2022 16:55:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Util/ConsoleManager.cs | 101 ---- Util/DragAdorner.cs | 170 ------- Util/ListViewDragDropManager.cs | 862 -------------------------------- Util/MouseUtilities.cs | 56 --- 4 files changed, 1189 deletions(-) delete mode 100644 Util/ConsoleManager.cs delete mode 100644 Util/DragAdorner.cs delete mode 100644 Util/ListViewDragDropManager.cs delete mode 100644 Util/MouseUtilities.cs diff --git a/Util/ConsoleManager.cs b/Util/ConsoleManager.cs deleted file mode 100644 index 791ecd9..0000000 --- a/Util/ConsoleManager.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Security; - -namespace GeekDesk.Util -{ - [SuppressUnmanagedCodeSecurity] - public static class ConsoleManager - { - private const string Kernel32_DllName = "kernel32.dll"; - - [DllImport(Kernel32_DllName)] - private static extern bool AllocConsole(); - - [DllImport(Kernel32_DllName)] - private static extern bool FreeConsole(); - - [DllImport(Kernel32_DllName)] - private static extern IntPtr GetConsoleWindow(); - - [DllImport(Kernel32_DllName)] - private static extern int GetConsoleOutputCP(); - - public static bool HasConsole - { - get { return GetConsoleWindow() != IntPtr.Zero; } - } - - /// - /// Creates a new console instance if the process is not attached to a console already. - /// - public static void Show() - { - //#if DEBUG - if (!HasConsole) - { - AllocConsole(); - InvalidateOutAndError(); - } - //#endif - } - - /// - /// If the process has a console attached to it, it will be detached and no longer visible. Writing to the System.Console is still possible, but no output will be shown. - /// - public static void Hide() - { - //#if DEBUG - if (HasConsole) - { - SetOutAndErrorNull(); - FreeConsole(); - } - //#endif - } - - public static void Toggle() - { - if (HasConsole) - { - Hide(); - } - else - { - Show(); - } - } - - static void InvalidateOutAndError() - { - Type type = typeof(System.Console); - - System.Reflection.FieldInfo _out = type.GetField("_out", - System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); - - System.Reflection.FieldInfo _error = type.GetField("_error", - System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); - - System.Reflection.MethodInfo _InitializeStdOutError = type.GetMethod("InitializeStdOutError", - System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); - - Debug.Assert(_out != null); - Debug.Assert(_error != null); - - Debug.Assert(_InitializeStdOutError != null); - - _out.SetValue(null, null); - _error.SetValue(null, null); - - _InitializeStdOutError.Invoke(null, new object[] { true }); - } - - static void SetOutAndErrorNull() - { - Console.SetOut(TextWriter.Null); - Console.SetError(TextWriter.Null); - } - } -} diff --git a/Util/DragAdorner.cs b/Util/DragAdorner.cs deleted file mode 100644 index 57c0f40..0000000 --- a/Util/DragAdorner.cs +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (C) Josh Smith - January 2007 -using System.Windows; -using System.Windows.Documents; -using System.Windows.Media; -using System.Windows.Shapes; - -namespace WPF.JoshSmith.Adorners -{ - /// - /// Renders a visual which can follow the mouse cursor, - /// such as during a drag-and-drop operation. - /// - public class DragAdorner : Adorner - { - #region Data - - private Rectangle child = null; - private double offsetLeft = 0; - private double offsetTop = 0; - - #endregion // Data - - #region Constructor - - /// - /// Initializes a new instance of DragVisualAdorner. - /// - /// The element being adorned. - /// The size of the adorner. - /// A brush to with which to paint the adorner. - public DragAdorner(UIElement adornedElement, Size size, Brush brush) - : base(adornedElement) - { - Rectangle rect = new Rectangle(); - rect.Fill = brush; - rect.Width = size.Width; - rect.Height = size.Height; - rect.IsHitTestVisible = false; - this.child = rect; - } - - #endregion // Constructor - - #region Public Interface - - #region GetDesiredTransform - - /// - /// Override. - /// - /// - /// - public override GeneralTransform GetDesiredTransform(GeneralTransform transform) - { - GeneralTransformGroup result = new GeneralTransformGroup(); - result.Children.Add(base.GetDesiredTransform(transform)); - result.Children.Add(new TranslateTransform(this.offsetLeft, this.offsetTop)); - return result; - } - - #endregion // GetDesiredTransform - - #region OffsetLeft - - /// - /// Gets/sets the horizontal offset of the adorner. - /// - public double OffsetLeft - { - get { return this.offsetLeft; } - set - { - this.offsetLeft = value; - UpdateLocation(); - } - } - - #endregion // OffsetLeft - - #region SetOffsets - - /// - /// Updates the location of the adorner in one atomic operation. - /// - /// - /// - public void SetOffsets(double left, double top) - { - this.offsetLeft = left; - this.offsetTop = top; - this.UpdateLocation(); - } - - #endregion // SetOffsets - - #region OffsetTop - - /// - /// Gets/sets the vertical offset of the adorner. - /// - public double OffsetTop - { - get { return this.offsetTop; } - set - { - this.offsetTop = value; - UpdateLocation(); - } - } - - #endregion // OffsetTop - - #endregion // Public Interface - - #region Protected Overrides - - /// - /// Override. - /// - /// - /// - protected override Size MeasureOverride(Size constraint) - { - this.child.Measure(constraint); - return this.child.DesiredSize; - } - - /// - /// Override. - /// - /// - /// - protected override Size ArrangeOverride(Size finalSize) - { - this.child.Arrange(new Rect(finalSize)); - return finalSize; - } - - /// - /// Override. - /// - /// - /// - protected override Visual GetVisualChild(int index) - { - return this.child; - } - - /// - /// Override. Always returns 1. - /// - protected override int VisualChildrenCount - { - get { return 1; } - } - - #endregion // Protected Overrides - - #region Private Helpers - - private void UpdateLocation() - { - AdornerLayer adornerLayer = this.Parent as AdornerLayer; - if (adornerLayer != null) - adornerLayer.Update(this.AdornedElement); - } - - #endregion // Private Helpers - } -} \ No newline at end of file diff --git a/Util/ListViewDragDropManager.cs b/Util/ListViewDragDropManager.cs deleted file mode 100644 index 41f0e0d..0000000 --- a/Util/ListViewDragDropManager.cs +++ /dev/null @@ -1,862 +0,0 @@ -// Copyright (C) Josh Smith - January 2007 -using System; -using System.Collections.ObjectModel; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Controls.Primitives; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; -using WPF.JoshSmith.Adorners; -using WPF.JoshSmith.Controls.Utilities; - -namespace WPF.JoshSmith.ServiceProviders.UI -{ - #region ListViewDragDropManager - - /// - /// Manages the dragging and dropping of ListViewItems in a ListView. - /// The ItemType type parameter indicates the type of the objects in - /// the ListView's items source. The ListView's ItemsSource must be - /// set to an instance of ObservableCollection of ItemType, or an - /// Exception will be thrown. - /// - /// The type of the ListView's items. - public class ListViewDragDropManager where ItemType : class - { - #region Data - - bool canInitiateDrag; - DragAdorner dragAdorner; - double dragAdornerOpacity; - int indexToSelect; - bool isDragInProgress; - ItemType itemUnderDragCursor; - ListView listView; - Point ptMouseDown; - bool showDragAdorner; - - #endregion // Data - - #region Constructors - - /// - /// Initializes a new instance of ListViewDragManager. - /// - public ListViewDragDropManager() - { - this.canInitiateDrag = false; - this.dragAdornerOpacity = 0.7; - this.indexToSelect = -1; - this.showDragAdorner = true; - } - - /// - /// Initializes a new instance of ListViewDragManager. - /// - /// - public ListViewDragDropManager(ListView listView) - : this() - { - this.ListView = listView; - } - - /// - /// Initializes a new instance of ListViewDragManager. - /// - /// - /// - public ListViewDragDropManager(ListView listView, double dragAdornerOpacity) - : this(listView) - { - this.DragAdornerOpacity = dragAdornerOpacity; - } - - /// - /// Initializes a new instance of ListViewDragManager. - /// - /// - /// - public ListViewDragDropManager(ListView listView, bool showDragAdorner) - : this(listView) - { - this.ShowDragAdorner = showDragAdorner; - } - - #endregion // Constructors - - #region Public Interface - - #region DragAdornerOpacity - - /// - /// Gets/sets the opacity of the drag adorner. This property has no - /// effect if ShowDragAdorner is false. The default value is 0.7 - /// - public double DragAdornerOpacity - { - get { return this.dragAdornerOpacity; } - set - { - if (this.IsDragInProgress) - throw new InvalidOperationException("Cannot set the DragAdornerOpacity property during a drag operation."); - - if (value < 0.0 || value > 1.0) - throw new ArgumentOutOfRangeException("DragAdornerOpacity", value, "Must be between 0 and 1."); - - this.dragAdornerOpacity = value; - } - } - - #endregion // DragAdornerOpacity - - #region IsDragInProgress - - /// - /// Returns true if there is currently a drag operation being managed. - /// - public bool IsDragInProgress - { - get { return this.isDragInProgress; } - private set { this.isDragInProgress = value; } - } - - #endregion // IsDragInProgress - - #region ListView - - /// - /// Gets/sets the ListView whose dragging is managed. This property - /// can be set to null, to prevent drag management from occuring. If - /// the ListView's AllowDrop property is false, it will be set to true. - /// - public ListView ListView - { - get { return listView; } - set - { - if (this.IsDragInProgress) - throw new InvalidOperationException("Cannot set the ListView property during a drag operation."); - - if (this.listView != null) - { - #region Unhook Events - - this.listView.PreviewMouseLeftButtonDown -= listView_PreviewMouseLeftButtonDown; - this.listView.PreviewMouseMove -= listView_PreviewMouseMove; - this.listView.DragOver -= listView_DragOver; - this.listView.DragLeave -= listView_DragLeave; - this.listView.DragEnter -= listView_DragEnter; - this.listView.Drop -= listView_Drop; - - #endregion // Unhook Events - } - - this.listView = value; - - if (this.listView != null) - { - if (!this.listView.AllowDrop) - this.listView.AllowDrop = true; - - #region Hook Events - - this.listView.PreviewMouseLeftButtonDown += listView_PreviewMouseLeftButtonDown; - this.listView.PreviewMouseMove += listView_PreviewMouseMove; - this.listView.DragOver += listView_DragOver; - this.listView.DragLeave += listView_DragLeave; - this.listView.DragEnter += listView_DragEnter; - this.listView.Drop += listView_Drop; - - #endregion // Hook Events - } - } - } - - #endregion // ListView - - #region ProcessDrop [event] - - /// - /// Raised when a drop occurs. By default the dropped item will be moved - /// to the target index. Handle this event if relocating the dropped item - /// requires custom behavior. Note, if this event is handled the default - /// item dropping logic will not occur. - /// - public event EventHandler> ProcessDrop; - - #endregion // ProcessDrop [event] - - #region ShowDragAdorner - - /// - /// Gets/sets whether a visual representation of the ListViewItem being dragged - /// follows the mouse cursor during a drag operation. The default value is true. - /// - public bool ShowDragAdorner - { - get { return this.showDragAdorner; } - set - { - if (this.IsDragInProgress) - throw new InvalidOperationException("Cannot set the ShowDragAdorner property during a drag operation."); - - this.showDragAdorner = value; - } - } - - #endregion // ShowDragAdorner - - #endregion // Public Interface - - #region Event Handling Methods - - #region listView_PreviewMouseLeftButtonDown - - void listView_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) - { - if (this.IsMouseOverScrollbar) - { - // 4/13/2007 - Set the flag to false when cursor is over scrollbar. - this.canInitiateDrag = false; - return; - } - - int index = this.IndexUnderDragCursor; - this.canInitiateDrag = index > -1; - - if (this.canInitiateDrag) - { - // Remember the location and index of the ListViewItem the user clicked on for later. - this.ptMouseDown = MouseUtilities.GetMousePosition(this.listView); - this.indexToSelect = index; - } - else - { - this.ptMouseDown = new Point(-10000, -10000); - this.indexToSelect = -1; - } - } - - #endregion // listView_PreviewMouseLeftButtonDown - - #region listView_PreviewMouseMove - - void listView_PreviewMouseMove(object sender, MouseEventArgs e) - { - if (!this.CanStartDragOperation) - return; - - // Select the item the user clicked on. - if (this.listView.SelectedIndex != this.indexToSelect) - this.listView.SelectedIndex = this.indexToSelect; - - // If the item at the selected index is null, there's nothing - // we can do, so just return; - if (this.listView.SelectedItem == null) - return; - - ListViewItem itemToDrag = this.GetListViewItem(this.listView.SelectedIndex); - if (itemToDrag == null) - return; - - AdornerLayer adornerLayer = this.ShowDragAdornerResolved ? this.InitializeAdornerLayer(itemToDrag) : null; - - this.InitializeDragOperation(itemToDrag); - this.PerformDragOperation(); - this.FinishDragOperation(itemToDrag, adornerLayer); - } - - #endregion // listView_PreviewMouseMove - - #region listView_DragOver - - void listView_DragOver(object sender, DragEventArgs e) - { - e.Effects = DragDropEffects.Move; - - if (this.ShowDragAdornerResolved) - this.UpdateDragAdornerLocation(); - - // Update the item which is known to be currently under the drag cursor. - int index = this.IndexUnderDragCursor; - this.ItemUnderDragCursor = index < 0 ? null : this.ListView.Items[index] as ItemType; - } - - #endregion // listView_DragOver - - #region listView_DragLeave - - void listView_DragLeave(object sender, DragEventArgs e) - { - if (!this.IsMouseOver(this.listView)) - { - if (this.ItemUnderDragCursor != null) - this.ItemUnderDragCursor = null; - - if (this.dragAdorner != null) - this.dragAdorner.Visibility = Visibility.Collapsed; - } - } - - #endregion // listView_DragLeave - - #region listView_DragEnter - - void listView_DragEnter(object sender, DragEventArgs e) - { - if (this.dragAdorner != null && this.dragAdorner.Visibility != Visibility.Visible) - { - // Update the location of the adorner and then show it. - this.UpdateDragAdornerLocation(); - this.dragAdorner.Visibility = Visibility.Visible; - } - } - - #endregion // listView_DragEnter - - #region listView_Drop - - void listView_Drop(object sender, DragEventArgs e) - { - if (this.ItemUnderDragCursor != null) - this.ItemUnderDragCursor = null; - - e.Effects = DragDropEffects.None; - - if (!e.Data.GetDataPresent(typeof(ItemType))) - return; - - // Get the data object which was dropped. - ItemType data = e.Data.GetData(typeof(ItemType)) as ItemType; - if (data == null) - return; - - // Get the ObservableCollection which contains the dropped data object. - ObservableCollection itemsSource = this.listView.ItemsSource as ObservableCollection; - if (itemsSource == null) - throw new Exception( - "A ListView managed by ListViewDragManager must have its ItemsSource set to an ObservableCollection."); - - int oldIndex = itemsSource.IndexOf(data); - int newIndex = this.IndexUnderDragCursor; - - if (newIndex < 0) - { - // The drag started somewhere else, and our ListView is empty - // so make the new item the first in the list. - if (itemsSource.Count == 0) - newIndex = 0; - - // The drag started somewhere else, but our ListView has items - // so make the new item the last in the list. - else if (oldIndex < 0) - newIndex = itemsSource.Count; - - // The user is trying to drop an item from our ListView into - // our ListView, but the mouse is not over an item, so don't - // let them drop it. - else - return; - } - - // Dropping an item back onto itself is not considered an actual 'drop'. - if (oldIndex == newIndex) - return; - - if (this.ProcessDrop != null) - { - // Let the client code process the drop. - ProcessDropEventArgs args = new ProcessDropEventArgs(itemsSource, data, oldIndex, newIndex, e.AllowedEffects); - this.ProcessDrop(this, args); - e.Effects = args.Effects; - } - else - { - // Move the dragged data object from it's original index to the - // new index (according to where the mouse cursor is). If it was - // not previously in the ListBox, then insert the item. - if (oldIndex > -1) - itemsSource.Move(oldIndex, newIndex); - else - itemsSource.Insert(newIndex, data); - - // Set the Effects property so that the call to DoDragDrop will return 'Move'. - e.Effects = DragDropEffects.Move; - } - } - - #endregion // listView_Drop - - #endregion // Event Handling Methods - - #region Private Helpers - - #region CanStartDragOperation - - bool CanStartDragOperation - { - get - { - if (Mouse.LeftButton != MouseButtonState.Pressed) - return false; - - if (!this.canInitiateDrag) - return false; - - if (this.indexToSelect == -1) - return false; - - if (!this.HasCursorLeftDragThreshold) - return false; - - return true; - } - } - - #endregion // CanStartDragOperation - - #region FinishDragOperation - - void FinishDragOperation(ListViewItem draggedItem, AdornerLayer adornerLayer) - { - // Let the ListViewItem know that it is not being dragged anymore. - ListViewItemDragState.SetIsBeingDragged(draggedItem, false); - - this.IsDragInProgress = false; - - if (this.ItemUnderDragCursor != null) - this.ItemUnderDragCursor = null; - - // Remove the drag adorner from the adorner layer. - if (adornerLayer != null) - { - adornerLayer.Remove(this.dragAdorner); - this.dragAdorner = null; - } - } - - #endregion // FinishDragOperation - - #region GetListViewItem - - ListViewItem GetListViewItem(int index) - { - if (this.listView.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated) - return null; - - return this.listView.ItemContainerGenerator.ContainerFromIndex(index) as ListViewItem; - } - - ListViewItem GetListViewItem(ItemType dataItem) - { - if (this.listView.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated) - return null; - - return this.listView.ItemContainerGenerator.ContainerFromItem(dataItem) as ListViewItem; - } - - #endregion // GetListViewItem - - #region HasCursorLeftDragThreshold - - bool HasCursorLeftDragThreshold - { - get - { - if (this.indexToSelect < 0) - return false; - - ListViewItem item = this.GetListViewItem(this.indexToSelect); - Rect bounds = VisualTreeHelper.GetDescendantBounds(item); - Point ptInItem = this.listView.TranslatePoint(this.ptMouseDown, item); - - // In case the cursor is at the very top or bottom of the ListViewItem - // we want to make the vertical threshold very small so that dragging - // over an adjacent item does not select it. - double topOffset = Math.Abs(ptInItem.Y); - double btmOffset = Math.Abs(bounds.Height - ptInItem.Y); - double vertOffset = Math.Min(topOffset, btmOffset); - - double width = SystemParameters.MinimumHorizontalDragDistance * 2; - double height = Math.Min(SystemParameters.MinimumVerticalDragDistance, vertOffset) * 2; - Size szThreshold = new Size(width, height); - - Rect rect = new Rect(this.ptMouseDown, szThreshold); - rect.Offset(szThreshold.Width / -2, szThreshold.Height / -2); - Point ptInListView = MouseUtilities.GetMousePosition(this.listView); - return !rect.Contains(ptInListView); - } - } - - #endregion // HasCursorLeftDragThreshold - - #region IndexUnderDragCursor - - /// - /// Returns the index of the ListViewItem underneath the - /// drag cursor, or -1 if the cursor is not over an item. - /// - int IndexUnderDragCursor - { - get - { - int index = -1; - for (int i = 0; i < this.listView.Items.Count; ++i) - { - ListViewItem item = this.GetListViewItem(i); - if (this.IsMouseOver(item)) - { - index = i; - break; - } - } - return index; - } - } - - #endregion // IndexUnderDragCursor - - #region InitializeAdornerLayer - - AdornerLayer InitializeAdornerLayer(ListViewItem itemToDrag) - { - // Create a brush which will paint the ListViewItem onto - // a visual in the adorner layer. - VisualBrush brush = new VisualBrush(itemToDrag); - - // Create an element which displays the source item while it is dragged. - this.dragAdorner = new DragAdorner(this.listView, itemToDrag.RenderSize, brush); - - // Set the drag adorner's opacity. - this.dragAdorner.Opacity = this.DragAdornerOpacity; - - AdornerLayer layer = AdornerLayer.GetAdornerLayer(this.listView); - layer.Add(dragAdorner); - - // Save the location of the cursor when the left mouse button was pressed. - this.ptMouseDown = MouseUtilities.GetMousePosition(this.listView); - - return layer; - } - - #endregion // InitializeAdornerLayer - - #region InitializeDragOperation - - void InitializeDragOperation(ListViewItem itemToDrag) - { - // Set some flags used during the drag operation. - this.IsDragInProgress = true; - this.canInitiateDrag = false; - - // Let the ListViewItem know that it is being dragged. - ListViewItemDragState.SetIsBeingDragged(itemToDrag, true); - } - - #endregion // InitializeDragOperation - - #region IsMouseOver - - bool IsMouseOver(Visual target) - { - // We need to use MouseUtilities to figure out the cursor - // coordinates because, during a drag-drop operation, the WPF - // mechanisms for getting the coordinates behave strangely. - - Rect bounds = VisualTreeHelper.GetDescendantBounds(target); - Point mousePos = MouseUtilities.GetMousePosition(target); - return bounds.Contains(mousePos); - } - - #endregion // IsMouseOver - - #region IsMouseOverScrollbar - - /// - /// Returns true if the mouse cursor is over a scrollbar in the ListView. - /// - bool IsMouseOverScrollbar - { - get - { - Point ptMouse = MouseUtilities.GetMousePosition(this.listView); - HitTestResult res = VisualTreeHelper.HitTest(this.listView, ptMouse); - if (res == null) - return false; - - DependencyObject depObj = res.VisualHit; - while (depObj != null) - { - if (depObj is ScrollBar) - return true; - - // VisualTreeHelper works with objects of type Visual or Visual3D. - // If the current object is not derived from Visual or Visual3D, - // then use the LogicalTreeHelper to find the parent element. - if (depObj is Visual || depObj is System.Windows.Media.Media3D.Visual3D) - depObj = VisualTreeHelper.GetParent(depObj); - else - depObj = LogicalTreeHelper.GetParent(depObj); - } - - return false; - } - } - - #endregion // IsMouseOverScrollbar - - #region ItemUnderDragCursor - - ItemType ItemUnderDragCursor - { - get { return this.itemUnderDragCursor; } - set - { - if (this.itemUnderDragCursor == value) - return; - - // The first pass handles the previous item under the cursor. - // The second pass handles the new one. - for (int i = 0; i < 2; ++i) - { - if (i == 1) - this.itemUnderDragCursor = value; - - if (this.itemUnderDragCursor != null) - { - ListViewItem listViewItem = this.GetListViewItem(this.itemUnderDragCursor); - if (listViewItem != null) - ListViewItemDragState.SetIsUnderDragCursor(listViewItem, i == 1); - } - } - } - } - - #endregion // ItemUnderDragCursor - - #region PerformDragOperation - - void PerformDragOperation() - { - ItemType selectedItem = this.listView.SelectedItem as ItemType; - DragDropEffects allowedEffects = DragDropEffects.Move | DragDropEffects.Move | DragDropEffects.Link; - if (DragDrop.DoDragDrop(this.listView, selectedItem, allowedEffects) != DragDropEffects.None) - { - // The item was dropped into a new location, - // so make it the new selected item. - this.listView.SelectedItem = selectedItem; - } - } - - #endregion // PerformDragOperation - - #region ShowDragAdornerResolved - - bool ShowDragAdornerResolved - { - get { return this.ShowDragAdorner && this.DragAdornerOpacity > 0.0; } - } - - #endregion // ShowDragAdornerResolved - - #region UpdateDragAdornerLocation - - void UpdateDragAdornerLocation() - { - if (this.dragAdorner != null) - { - Point ptCursor = MouseUtilities.GetMousePosition(this.ListView); - - double left = ptCursor.X - this.ptMouseDown.X; - - // 4/13/2007 - Made the top offset relative to the item being dragged. - ListViewItem itemBeingDragged = this.GetListViewItem(this.indexToSelect); - Point itemLoc = itemBeingDragged.TranslatePoint(new Point(0, 0), this.ListView); - double top = itemLoc.Y + ptCursor.Y - this.ptMouseDown.Y; - - this.dragAdorner.SetOffsets(left, top); - } - } - - #endregion // UpdateDragAdornerLocation - - #endregion // Private Helpers - } - - #endregion // ListViewDragDropManager - - #region ListViewItemDragState - - /// - /// Exposes attached properties used in conjunction with the ListViewDragDropManager class. - /// Those properties can be used to allow triggers to modify the appearance of ListViewItems - /// in a ListView during a drag-drop operation. - /// - public static class ListViewItemDragState - { - #region IsBeingDragged - - /// - /// Identifies the ListViewItemDragState's IsBeingDragged attached property. - /// This field is read-only. - /// - public static readonly DependencyProperty IsBeingDraggedProperty = - DependencyProperty.RegisterAttached( - "IsBeingDragged", - typeof(bool), - typeof(ListViewItemDragState), - new UIPropertyMetadata(false)); - - /// - /// Returns true if the specified ListViewItem is being dragged, else false. - /// - /// The ListViewItem to check. - public static bool GetIsBeingDragged(ListViewItem item) - { - return (bool)item.GetValue(IsBeingDraggedProperty); - } - - /// - /// Sets the IsBeingDragged attached property for the specified ListViewItem. - /// - /// The ListViewItem to set the property on. - /// Pass true if the element is being dragged, else false. - internal static void SetIsBeingDragged(ListViewItem item, bool value) - { - item.SetValue(IsBeingDraggedProperty, value); - } - - #endregion // IsBeingDragged - - #region IsUnderDragCursor - - /// - /// Identifies the ListViewItemDragState's IsUnderDragCursor attached property. - /// This field is read-only. - /// - public static readonly DependencyProperty IsUnderDragCursorProperty = - DependencyProperty.RegisterAttached( - "IsUnderDragCursor", - typeof(bool), - typeof(ListViewItemDragState), - new UIPropertyMetadata(false)); - - /// - /// Returns true if the specified ListViewItem is currently underneath the cursor - /// during a drag-drop operation, else false. - /// - /// The ListViewItem to check. - public static bool GetIsUnderDragCursor(ListViewItem item) - { - return (bool)item.GetValue(IsUnderDragCursorProperty); - } - - /// - /// Sets the IsUnderDragCursor attached property for the specified ListViewItem. - /// - /// The ListViewItem to set the property on. - /// Pass true if the element is underneath the drag cursor, else false. - internal static void SetIsUnderDragCursor(ListViewItem item, bool value) - { - item.SetValue(IsUnderDragCursorProperty, value); - } - - #endregion // IsUnderDragCursor - } - - #endregion // ListViewItemDragState - - #region ProcessDropEventArgs - - /// - /// Event arguments used by the ListViewDragDropManager.ProcessDrop event. - /// - /// The type of data object being dropped. - public class ProcessDropEventArgs : EventArgs where ItemType : class - { - #region Data - - ObservableCollection itemsSource; - ItemType dataItem; - int oldIndex; - int newIndex; - DragDropEffects allowedEffects = DragDropEffects.None; - DragDropEffects effects = DragDropEffects.None; - - #endregion // Data - - #region Constructor - - internal ProcessDropEventArgs( - ObservableCollection itemsSource, - ItemType dataItem, - int oldIndex, - int newIndex, - DragDropEffects allowedEffects) - { - this.itemsSource = itemsSource; - this.dataItem = dataItem; - this.oldIndex = oldIndex; - this.newIndex = newIndex; - this.allowedEffects = allowedEffects; - } - - #endregion // Constructor - - #region Public Properties - - /// - /// The items source of the ListView where the drop occurred. - /// - public ObservableCollection ItemsSource - { - get { return this.itemsSource; } - } - - /// - /// The data object which was dropped. - /// - public ItemType DataItem - { - get { return this.dataItem; } - } - - /// - /// The current index of the data item being dropped, in the ItemsSource collection. - /// - public int OldIndex - { - get { return this.oldIndex; } - } - - /// - /// The target index of the data item being dropped, in the ItemsSource collection. - /// - public int NewIndex - { - get { return this.newIndex; } - } - - /// - /// The drag drop effects allowed to be performed. - /// - public DragDropEffects AllowedEffects - { - get { return allowedEffects; } - } - - /// - /// The drag drop effect(s) performed on the dropped item. - /// - public DragDropEffects Effects - { - get { return effects; } - set { effects = value; } - } - - #endregion // Public Properties - } - - #endregion // ProcessDropEventArgs -} \ No newline at end of file diff --git a/Util/MouseUtilities.cs b/Util/MouseUtilities.cs deleted file mode 100644 index a81af01..0000000 --- a/Util/MouseUtilities.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Runtime.InteropServices; -using System.Windows; -using System.Windows.Media; - -namespace WPF.JoshSmith.Controls.Utilities -{ - /// - /// Provides access to the mouse location by calling unmanaged code. - /// - /// - /// This class was written by Dan Crevier (Microsoft). - /// http://blogs.msdn.com/llobo/archive/2006/09/06/Scrolling-Scrollviewer-on-Mouse-Drag-at-the-boundaries.aspx - /// - public class MouseUtilities - { - [StructLayout(LayoutKind.Sequential)] - private struct Win32Point - { - public Int32 X; - public Int32 Y; - }; - - [DllImport("user32.dll")] - private static extern bool GetCursorPos(ref Win32Point pt); - - [DllImport("user32.dll")] - private static extern bool ScreenToClient(IntPtr hwnd, ref Win32Point pt); - - /// - /// Returns the mouse cursor location. This method is necessary during - /// a drag-drop operation because the WPF mechanisms for retrieving the - /// cursor coordinates are unreliable. - /// - /// The Visual to which the mouse coordinates will be relative. - public static Point GetMousePosition(Visual relativeTo) - { - Win32Point mouse = new Win32Point(); - GetCursorPos(ref mouse); - - // Using PointFromScreen instead of Dan Crevier's code (commented out below) - // is a bug fix created by William J. Roberts. Read his comments about the fix - // here: http://www.codeproject.com/useritems/ListViewDragDropManager.asp?msg=1911611#xx1911611xx - return relativeTo.PointFromScreen(new Point((double)mouse.X, (double)mouse.Y)); - - #region Commented Out - //System.Windows.Interop.HwndSource presentationSource = - // (System.Windows.Interop.HwndSource)PresentationSource.FromVisual( relativeTo ); - //ScreenToClient( presentationSource.Handle, ref mouse ); - //GeneralTransform transform = relativeTo.TransformToAncestor( presentationSource.RootVisual ); - //Point offset = transform.Transform( new Point( 0, 0 ) ); - //return new Point( mouse.X - offset.X, mouse.Y - offset.Y ); - #endregion // Commented Out - } - } -} \ No newline at end of file