Это еще проще, и, возможно, хакерство - поскольку я вижу много GDI-мышц в этой теме , и , очевидно, подходит только для определенных сценариев. YMMV
В моем сценарии я использую то, что я буду называть «Родительским» UserControl - и во время события Load
я просто удаляю элемент управления, которым нужно манипулировать, из коллекции .Controls
Родителя, и OnPaint
Родителя позаботится о том, чтобы полностью нарисовать дочерний элемент управления каким-либо особым образом ... полностью отключить возможности рисования ребенка в автономном режиме.
Теперь я передаю свою дочернюю процедуру рисования методу расширения на основе этой концепции от Майка Голда для печати оконных форм .
Здесь мне нужно подмножество меток для визуализации перпендикулярно к макету:
Затем я освобождаю дочерний элемент управления от рисования с помощью этого кода в обработчике ParentUserControl.Load
:
Private Sub ParentUserControl_Load(sender As Object, e As EventArgs) Handles MyBase.Load
SetStyle(ControlStyles.UserPaint, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
'exempt this control from standard painting:
Me.Controls.Remove(Me.HostedControlToBeRotated)
End Sub
Затем в том же ParentUserControl мы рисуем элемент управления, которым нужно манипулировать с нуля:
Protected Overrides Sub OnPaint(e As PaintEventArgs)
'here, we will custom paint the HostedControlToBeRotated instance...
'twist rendering mode 90 counter clockwise, and shift rendering over to right-most end
e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
e.Graphics.TranslateTransform(Me.Width - Me.HostedControlToBeRotated.Height, Me.Height)
e.Graphics.RotateTransform(-90)
MyCompany.Forms.CustomGDI.DrawControlAndChildren(Me.HostedControlToBeRotated, e.Graphics)
e.Graphics.ResetTransform()
e.Graphics.Dispose()
GC.Collect()
End Sub
После того, как вы где-нибудь разместите ParentUserControl, например, форма Windows - я обнаружил, что моя Visual Studio 2015 правильно отображает форму во время разработки, а также во время выполнения:
Теперь, так как мои конкретные манипуляции поворачивают дочерний элемент управления на 90 градусов, я уверен, что все горячие точки и интерактивность были уничтожены в этом регионе - но проблема, которую я решал, была связана с меткой пакета, которую нужно было предварительно просмотреть. и распечатать, что отлично сработало для меня.
Если есть способы восстановить горячие точки и контроль для моего намеренно осиротевшего контроля - я бы с радостью узнал об этом когда-нибудь (конечно, не для этого сценария, а ... просто для изучения). Конечно, WPF поддерживает такое безумие, OOTB ... но ... эй ... WinForms все еще очень забавны, правда?