.NET Как изменить местоположение и ширину элемента управления одновременно? - PullRequest
1 голос
/ 06 июля 2011

Редактировать: принять TextBox в качестве элемента управления для примера - где высота не является проблемой

Поэтому я использую мышь, чтобы изменить ширину и расположение элемента управления во время выполнения (через захват ручки с помощью мыши, почти так же, как вы можете изменить его во время разработки).Тем не менее, я заметил некоторые проблемы с изменением размера, которые, я думал, можно было бы исправить, вызвав

<panel>.SuspendLayout
<control>.location = new Point(x, y)
<control>.width = newWidth
<panel>.ResumeLayout

Теперь и местоположение, и ширина меняются правильно, но поскольку местоположение меняется первым - вы видите размытие текстового поля, изменяющегосяШирина после этого движется.Теперь, читая через Suspend и ResumeLayout, я предполагаю, что они должны быть вызваны до создания элементов управления.В таком случае: как мне убедиться, что местоположение и ширина меняются сразу, чтобы избежать размытия?

Редактировать: Решено - Следующий код позволил мне приостановить рисование элемента управления до того, как свойства были заданы, затемвозобновить после.В отличие от приостановки макета *

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Integer, _
                                                                ByVal wMsg As Integer, _
                                                                ByVal wParam As Integer,
                                                                ByVal lParam As Integer) As Integer

Private Const WM_SETREDRAW As Integer = 11

' Extension methods for Control
<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control, ByVal Redraw As Boolean)
  SendMessage(Target.Handle, WM_SETREDRAW, 1, 0)
  If Redraw Then
    Target.Refresh()
  End If
End Sub

<Extension()>
Public Sub SuspendDrawing(ByVal Target As Control)
  SendMessage(Target.Handle, WM_SETREDRAW, 0, 0)
End Sub

<Extension()>
Public Sub ResumeDrawing(ByVal Target As Control)
  ResumeDrawing(Target, True)
End Sub

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Вместо panel.SuspendLayout(), сделайте this.SuspendLayout().Suspend и Resume гарантированно пройдут по фактическому дереву объектов, но мне никогда не везло с тем, что оно стекает по дереву контейнеров.

1 голос
/ 06 июля 2011

Подходящим решением для предотвращения появления этого типа мерцания не было бы одновременное изменение обоих значений, так как одно всегда будет установлено раньше другого, но установка формы для использования двойной буферизации, Таким образом, ваши изменения выводятся за пределы экрана перед копированием в видимую область. Вы можете найти это свойство в вашей форме.

MSDN: для получения дополнительной информации о свойстве элемента управления DoubleBuffered .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...