16
我試圖創建一個WPF應用程序,我可以在其中拖動圖像。在WPF中拖動圖像
目前我有一個圖像放置在窗口的中心,我正在考慮使用三個mouseevents MouseDown,MouseMove和MouseUp來計算拖動圖像時的新位置。
關於如何做到這一點,還有其他好點子嗎?我對WPF完全陌生,所以我的心態仍然在Windows窗體世界。
據我所見,我需要使用一個 爲了有絕對定位可用。
我試圖創建一個WPF應用程序,我可以在其中拖動圖像。在WPF中拖動圖像
目前我有一個圖像放置在窗口的中心,我正在考慮使用三個mouseevents MouseDown,MouseMove和MouseUp來計算拖動圖像時的新位置。
關於如何做到這一點,還有其他好點子嗎?我對WPF完全陌生,所以我的心態仍然在Windows窗體世界。
據我所見,我需要使用一個 爲了有絕對定位可用。
好吧,這裏是一個附加屬性的「行爲」,你可以用它來製作可拖動的任何元素,只要它是在畫布上:
public class DraggableExtender : DependencyObject
{
// This is the dependency property we're exposing - we'll
// access this as DraggableExtender.CanDrag="true"/"false"
public static readonly DependencyProperty CanDragProperty =
DependencyProperty.RegisterAttached("CanDrag",
typeof(bool),
typeof(DraggableExtender),
new UIPropertyMetadata(false, OnChangeCanDragProperty));
// The expected static setter
public static void SetCanDrag(UIElement element, bool o)
{
element.SetValue(CanDragProperty, o);
}
// the expected static getter
public static bool GetCanDrag(UIElement element)
{
return (bool) element.GetValue(CanDragProperty);
}
// This is triggered when the CanDrag property is set. We'll
// simply check the element is a UI element and that it is
// within a canvas. If it is, we'll hook into the mouse events
private static void OnChangeCanDragProperty(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
UIElement element = d as UIElement;
if (element == null) return;
if (e.NewValue != e.OldValue)
{
if ((bool)e.NewValue)
{
element.PreviewMouseDown += element_PreviewMouseDown;
element.PreviewMouseUp += element_PreviewMouseUp;
element.PreviewMouseMove += element_PreviewMouseMove;
}
else
{
element.PreviewMouseDown -= element_PreviewMouseDown;
element.PreviewMouseUp -= element_PreviewMouseUp;
element.PreviewMouseMove -= element_PreviewMouseMove;
}
}
}
// Determine if we're presently dragging
private static bool _isDragging = false;
// The offset from the top, left of the item being dragged
// and the original mouse down
private static Point _offset;
// This is triggered when the mouse button is pressed
// on the element being hooked
static void element_PreviewMouseDown(object sender,
System.Windows.Input.MouseButtonEventArgs e)
{
// Ensure it's a framework element as we'll need to
// get access to the visual tree
FrameworkElement element = sender as FrameworkElement;
if (element == null) return;
// start dragging and get the offset of the mouse
// relative to the element
_isDragging = true;
_offset = e.GetPosition(element);
}
// This is triggered when the mouse is moved over the element
private static void element_PreviewMouseMove(object sender,
MouseEventArgs e)
{
// If we're not dragging, don't bother - also validate the element
if (!_isDragging) return;
FrameworkElement element = sender as FrameworkElement;
if (element == null) return;
Canvas canvas = element.Parent as Canvas;
if(canvas == null) return;
// Get the position of the mouse relative to the canvas
Point mousePoint = e.GetPosition(canvas);
// Offset the mouse position by the original offset position
mousePoint.Offset(-_offset.X, -_offset.Y);
// Move the element on the canvas
element.SetValue(Canvas.LeftProperty, mousePoint.X);
element.SetValue(Canvas.TopProperty, mousePoint.Y);
}
// this is triggered when the mouse is released
private static void element_PreviewMouseUp(object sender,
MouseButtonEventArgs e)
{
_isDragging = false;
}
}
您可以在XAML通過導入命名空間的類,然後用這個包含在(這樣的事情:)
<Window x:Class="WPFFunWithDragging.Window1"
xmlns:local="clr-namespace:WPFFunWithDragging" .. >
然後你可以只設置DraggableExtender.CanDrag =「真」的元素,拖動:
<Canvas>
<Image Source="Garden.jpg"
Width="50"
Canvas.Left="10" Canvas.Top="10"
local:DraggableExtender.CanDrag="true"/>
</Canvas>
希望這有些用處:)
謝謝 - 非常有用的代碼。我會稍微改進它,讓鼠標在鼠標下捕獲鼠標並釋放鼠標捕獲。否則,如果由於某種原因鼠標落在被拖動項目的邊界之外,很容易錯過鼠標移動。 – 2009-03-30 10:21:50