Это даже проще и, может быть, хакерски - поскольку я вижу много мышц 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 Form - я обнаружил, что моя Visual Studio 2015 правильно отображает форму во время разработки, а также во время выполнения:
Теперь, так как мои особые манипуляции поворачивают дочерний элемент управления на 90 градусов, я уверен, что все горячие точки и интерактивность были уничтожены в этом регионе - но проблема, которую я решал, заключалась в том, чтобы наклеить этикетку на упаковку, которую нужно было предварительно просмотреть и напечатать, который работал хорошо для меня.
Если есть способы восстановить «горячие точки» и контроль для моего намеренно осиротевшего контроля - я бы с радостью узнал об этом когда-нибудь (конечно, не для этого сценария, но… просто для изучения). Конечно, WPF поддерживает такое сумасшествие ... OOTB ... но ... эй ... WinForms так весело, правда?