Dies ist noch einfacher und vielleicht hacky - da ich in diesem Thread viel GDI-Muskel sehen kann und offensichtlich nur für bestimmte Szenarien gut geeignet ist. YMMV
In meinem Szenario verwende ich das, was ich als "Eltern" -Benutzersteuerung bezeichne - und während des Load
Ereignisses entferne ich einfach das zu manipulierende Steuerelement aus der .Controls
Sammlung der Eltern, und die Eltern OnPaint
kümmern sich darum, das Kind vollständig zu malen Kontrolle auf welche Art und Weise auch immer. Die Malfähigkeiten des Kindes werden vollständig offline geschaltet.
Jetzt übergebe ich meine Kindermalroutine an eine Erweiterungsmethode, die auf diesem Konzept von Mike Gold zum Drucken von Windows-Formularen basiert .
Hier benötige ich eine Untergruppe von Beschriftungen, um senkrecht zum Layout zu rendern :
Dann befreie ich das untergeordnete Steuerelement mit diesem Code im ParentUserControl.Load
Ereignishandler vom Zeichnen:
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
Dann malen wir in demselben ParentUserControl das zu manipulierende Steuerelement von Grund auf neu:
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
Sobald Sie das ParentUserControl irgendwo gehostet haben, z. B. in einem Windows-Formular, stelle ich fest, dass mein Visual Studio 2015 das Formular sowohl zur Entwurfszeit als auch zur Laufzeit korrekt wiedergibt :
Jetzt, da meine spezielle Manipulation die Kindersteuerung um 90 Grad dreht, bin ich sicher, dass alle Hotspots und Interaktivität in dieser Region zerstört wurden - aber das Problem, das ich gelöst habe, war alles für ein Paketetikett, das in der Vorschau angezeigt und gedruckt werden musste. was für mich gut geklappt hat.
Wenn es Möglichkeiten gibt, die Hot Spots und die Kontrolle wieder in meine absichtlich verwaiste Kontrolle einzuführen, würde ich gerne eines Tages davon erfahren (natürlich nicht für dieses Szenario, aber ... nur um zu lernen). Natürlich unterstützt WPF solche Verrücktheit OOTB .. aber .. hey .. WinForms macht immer noch so viel Spaß, oder?