public static void MoveAsAGroup(this Window me,
double desiredXDisplacement, double desiredYDisplacement,
ref bool isIgnoringLocationChangedEvent)
{
// Ensure we don't recurse when we reposition.
isIgnoringLocationChangedEvent = true;
Window windowToMoveWith = me.Owner;
// Try to prevent me from sliding off the screen horizontally.
double bitToShow = 32;
double leftLimit = SystemParameters.VirtualScreenLeft - me.Width + bitToShow;
double rightLimit = SystemParameters.VirtualScreenWidth - bitToShow;
bool notTooMuchXDisplacement = Math.Abs(me.Left - windowToMoveWith.Left) < Math.Abs(desiredXDisplacement);
if (me.Left >= rightLimit && notTooMuchXDisplacement)
{
// bumping against the right.
me.Left = rightLimit;
}
else if (me.Left <= leftLimit && notTooMuchXDisplacement)
{
// bumping against the left.
me.Left = leftLimit;
}
else // it's cool - just slide along with the other window.
{
me.Left = windowToMoveWith.Left + desiredXDisplacement;
}
// Try to prevent me from sliding off the screen vertically.
double topLimit = SystemParameters.VirtualScreenTop - me.Height + bitToShow;
double bottomLimit = SystemParameters.VirtualScreenTop + SystemParameters.VirtualScreenHeight - bitToShow;
bool notTooMuchYDisplacement = Math.Abs(me.Top - windowToMoveWith.Top) < Math.Abs(desiredYDisplacement);
if (me.Top <= topLimit && notTooMuchYDisplacement)
{
// bumping up against the top.
//Console.WriteLine("setting to topLimit of " + topLimit);
me.Top = topLimit;
}
else if (me.Top >= bottomLimit && notTooMuchYDisplacement)
{
// bumping against the bottom.
me.Top = bottomLimit;
}
else // it's cool - just slide along with the other window.
{
me.Top = windowToMoveWith.Top + desiredYDisplacement;
}
// Reset the handler for the LocationChanged event.
isIgnoringLocationChangedEvent = false;
}