Annoying thing happening with AutoScroll...
This AutoScroll feature
on controls that are ScrollableControls is
pretty neat, but there is a slight problem. Here's the scenario...
Project Setup:
- Add a Panel control to a Windows Form. Set
it to AutoScroll.
- Within this Panel add a PictureBox. Make this set to AutoSize. Load a large image on the Form's Load
event.
- Add a Button to the Windows Form. The code
for the Button's Click event should be pictureBox1.Select()
Test Scenario:
- After the application has loaded, scroll to the lower right hand corner of
the PictureBox on the Panel.
- Now click the Button.
- Notice that the Location of the PictureBox has changed.
This is quite annoying!! I would have figured that the Location should not change. I tried to figure out a
way to prevent this from happening, but after an extensive search I kept getting
the same result. In an internal method call, the RectLocation is being set to
(0,0). I would have figured that the Location
should not change after a Select(). Here's the
relevant portion of my stack trace along with the line that sets the position
back to (0,0) highlighted:
TestApp.exe!TestApp.TestApp.pictureBox1_LocationChanged(System.Object
sender = {System.Windows.Forms.PictureBox}, System.EventArgs e =
{System.EventArgs}) Line
668 C#
system.windows.forms.dll!System.Windows.Forms.Control::OnLocationChanged(System.EventArgs
e = {System.EventArgs}) + 0x73
bytes
system.windows.forms.dll!System.Windows.Forms.Control::UpdateBounds(__int32
x = 0, __int32 y = 0, __int32 width = 1752, __int32 height = 1168, __int32
clientWidth = 1752, __int32 clientHeight = 1168) + 0xb1
bytes
system.windows.forms.dll!System.Windows.Forms.Control::UpdateBounds()
+ 0xb8
bytes
system.windows.forms.dll!System.Windows.Forms.Control::WmMove(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0x20
bytes
system.windows.forms.dll!System.Windows.Forms.Control::WndProc(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0x6ac
bytes
system.windows.forms.dll!ControlNativeWindow::OnMessage(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0x19
bytes
system.windows.forms.dll!ControlNativeWindow::WndProc(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0xda
bytes
system.windows.forms.dll!System.Windows.Forms.NativeWindow::DebuggableCallback(__int32
hWnd = 2032966, __int32 msg = 3, __int32 wparam = 0, __int32 lparam = 0) +
0x39 bytes
system.windows.forms.dll!System.Windows.Forms.ScrollableControl::SetDisplayRectLocation(__int32
x = 0, __int32 y = 0) + 0x254
bytes
system.windows.forms.dll!System.Windows.Forms.ScrollableControl::ScrollControlIntoView(System.Windows.Forms.Control
activeControl = {System.Windows.Forms.PictureBox}) + 0x366
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::ScrollActiveControlIntoView()
+ 0x3e
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::ActivateControlInternal(System.Windows.Forms.Control
control = {System.Windows.Forms.PictureBox}, bool originator = true) + 0x99
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::ActivateControlInternal(System.Windows.Forms.Control
control = {System.Windows.Forms.PictureBox}) + 0x19
bytes
system.windows.forms.dll!System.Windows.Forms.Control::WmSetFocus(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0x93
bytes
system.windows.forms.dll!System.Windows.Forms.Control::WndProc(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0x7bb
bytes
system.windows.forms.dll!ControlNativeWindow::OnMessage(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0x19
bytes
system.windows.forms.dll!ControlNativeWindow::WndProc(System.Windows.Forms.Message
m = {System.Windows.Forms.Message}) + 0xda
bytes
system.windows.forms.dll!System.Windows.Forms.NativeWindow::DebuggableCallback(__int32
hWnd = 2032966, __int32 msg = 7, __int32 wparam = 918718, __int32 lparam = 0)
+ 0x39
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::FocusActiveControlInternal()
+ 0x6e
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::SetActiveControlInternal(System.Windows.Forms.Control
value = {System.Windows.Forms.PictureBox}) + 0x94
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::SetActiveControl(System.Windows.Forms.Control
ctl = {System.Windows.Forms.PictureBox}) + 0x2f
bytes
system.windows.forms.dll!System.Windows.Forms.ContainerControl::set_ActiveControl(System.Windows.Forms.Control
value = {System.Windows.Forms.PictureBox}) + 0x16
bytes
system.windows.forms.dll!System.Windows.Forms.Control::Select(bool
directed = false, bool forward = false) + 0x32
bytes
system.windows.forms.dll!System.Windows.Forms.Control::Select()
+ 0x15 bytes
TestApp.exe!TestApp.TestApp.button4_Click(System.Object
sender = {Text="button4"}, System.EventArgs e = {System.EventArgs}) Line
664 C#
Maybe in future versions this can be a flag... ResetRect = true or
false.
Robert has been at Microsoft since August 2003. He has worked on WPF Imaging, Media, and Effects, and Windows Vista (in the form of the Windows Imaging Component). He is currently the test lead for the Windows Imaging Component.