You should only change ScissorRectangle between sprite batches. So each time you have a change in ScissorRect, you must end and restart your sprite batch. I know, it's a real pain. I put in a request to alleviate this behavior in the MS Connect here -
https://connect.microsoft.com/feedback/ViewFeedback.aspx FeedbackID=248087&SiteID=226
Nick, Buttermilk (my game's open sourced engine) uses a RenderQueue which queues all the renderables in the game and sorts them by their render state (scissor rectangle included) so that they can be batched as much as possible. It complex, but you can check out how it does it for your own personal reference. Or you can just use Buttermilk for you GUI system without having to write your own (though it's still in progress).
http://www.codeplex.com/buttermilk
This is the approach that i took, which seems to work just fine.
-MB
Would this work
Rectangle GetClippedRectangle(Rectangle rect, Rectangle clip)
{
int clipX = Math.Min(clip.Right, Math.Max(clip.Left, rect.Left));
int clipY = Math.Min(clip.Bottom, Math.Max(clip.Top, rect.Top));
int clipWidth = Math.Min((clip.Right - clipX), (rect.Right - clipX));
int clipHeight = Math.Min((clip.Bottom - clipY), (rect.Bottom - clipY));
return new Rectangle(clipX, clipY, clipWidth, clipHeight);
}