WPF: Drag Parent Window Behaviour

Just a quick post this time: I had a need to be able to reposition a WPF window when I click and dragged on a particular UIElement. The aim was to recreate the behaviour of clicking and dragging on a standard Windows title bar (in my case, I was implementing my own title bar).
It turns out this is very easy to achieve, so I wrapped the functionality up in a simple WPF behaviour. You can simply attach this behaviour to any on-screen element, and it will automatically find the parent window, and hook everything up.
/// Attach this behaviour to any framework element to allow the entire parent window to be moved
/// when you click and drag this element.
/// </summary>
public class DragWindowBehaviour : Behavior<FrameworkElement>
{
private Window _parentWindow;
protected override void OnAttached()
{
_parentWindow = GetParentWindow(AssociatedObject);
if (_parentWindow == null) return;
AssociatedObject.PreviewMouseLeftButtonDown += _associatedObject_MouseLeftButtonDown;
}
private void _associatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_parentWindow.DragMove();
}
private static Window GetParentWindow(DependencyObject attachedElement)
{
return attachedElement.TryFindParent<Window>();
}
protected override void OnDetaching()
{
AssociatedObject.PreviewMouseLeftButtonDown -= _associatedObject_MouseLeftButtonDown;
_parentWindow = null;
}
}
As I said, it’s simple code. The key part is the _parentWindow.DragMove() call, which effectively hands over the drag operation to the Window control.
Hopefully someone will find this useful 🙂