Refresh the panels of a SplitContainer as the splitter moves
I have a SplitContainer with two panels. When I drag the splitter to resize the two panels, I see a grayish bar as I'm dragging. The panels don't actually get redrawn until I release the mouse button. How can I make the panels refresh as I drag the splitter?
Fwiw, this 开发者_Python百科is achieved in Delphi by setting the "ResizeStyle" of the Splitter control to "rsUpdate".
I have tried putting the following code inside the SplitterMoving event with no visible changes.
private void splitCont_SplitterMoving(object sender, SplitterCancelEventArgs e)
{
splitCont.Invalidate();
//also tried this:
//splitCont.Refresh();
}
You could try using mouse events as detailed in this page:
//assign this to the SplitContainer's MouseDown event
private void splitCont_MouseDown(object sender, MouseEventArgs e)
{
// This disables the normal move behavior
((SplitContainer)sender).IsSplitterFixed = true;
}
//assign this to the SplitContainer's MouseUp event
private void splitCont_MouseUp(object sender, MouseEventArgs e)
{
// This allows the splitter to be moved normally again
((SplitContainer)sender).IsSplitterFixed = false;
}
//assign this to the SplitContainer's MouseMove event
private void splitCont_MouseMove(object sender, MouseEventArgs e)
{
// Check to make sure the splitter won't be updated by the
// normal move behavior also
if (((SplitContainer)sender).IsSplitterFixed)
{
// Make sure that the button used to move the splitter
// is the left mouse button
if (e.Button.Equals(MouseButtons.Left))
{
// Checks to see if the splitter is aligned Vertically
if (((SplitContainer)sender).Orientation.Equals(Orientation.Vertical))
{
// Only move the splitter if the mouse is within
// the appropriate bounds
if (e.X > 0 && e.X < ((SplitContainer)sender).Width)
{
// Move the splitter & force a visual refresh
((SplitContainer)sender).SplitterDistance = e.X;
((SplitContainer)sender).Refresh();
}
}
// If it isn't aligned vertically then it must be
// horizontal
else
{
// Only move the splitter if the mouse is within
// the appropriate bounds
if (e.Y > 0 && e.Y < ((SplitContainer)sender).Height)
{
// Move the splitter & force a visual refresh
((SplitContainer)sender).SplitterDistance = e.Y;
((SplitContainer)sender).Refresh();
}
}
}
// If a button other than left is pressed or no button
// at all
else
{
// This allows the splitter to be moved normally again
((SplitContainer)sender).IsSplitterFixed = false;
}
}
}
精彩评论