У меня есть холст сортов, полученных из «панели», используемый для пользовательского рисования линий и других геометрий, все из кода VB. Я получил этот подход из книги, и я не уверен, что это лучший подход. Часть чертежа работает до сих пор для меня.WPF: случайное размещение текстового поля на холсте
Но мне нужно, чтобы элемент управления текстовыми полями содержал текст, который может быть отредактирован пользователем. Текстовое поле должно быть размещено в координатах, определяемых динамически, а затем удалено. Вероятно, будут и другие элементы управления.
Следующий код ничего не делает:
tb = New TextBox()
tb.Text = "How now brown cow?"
tb.BorderThickness = New Thickness(3)
tb.BorderBrush = Brushes.CadetBlue
drawingSurface.Children.Add(tb)
Это определение моих DrawingCanvas:
Public Class DrawingCanvas
Inherits Panel
Private visuals As New List(Of Visual)()
Private hits As New List(Of DrawingVisual)()
Protected Overrides Function GetVisualChild(ByVal index As Integer) As Visual
Return visuals(index)
End Function
Protected Overrides ReadOnly Property VisualChildrenCount() As Integer
Get
Return visuals.Count
End Get
End Property
Public Sub AddVisual(ByVal visual As Visual)
visuals.Add(visual)
MyBase.AddVisualChild(visual)
MyBase.AddLogicalChild(visual)
End Sub
Public Sub DeleteVisual(ByVal visual As Visual)
visuals.Remove(visual)
MyBase.RemoveVisualChild(visual)
MyBase.RemoveLogicalChild(visual)
End Sub
Public Function GetVisual(ByVal point As Point) As DrawingVisual
Dim hitResult As HitTestResult = VisualTreeHelper.HitTest(Me, point)
Return TryCast(hitResult.VisualHit, DrawingVisual)
End Function
Public Function GetVisuals(ByVal region As Geometry) As List(Of DrawingVisual)
hits.Clear()
Dim parameters As New GeometryHitTestParameters(region)
Dim callback As New HitTestResultCallback(AddressOf Me.HitTestCallback)
VisualTreeHelper.HitTest(Me, Nothing, callback, parameters)
Return hits
End Function
Private Function HitTestCallback(ByVal result As HitTestResult) As HitTestResultBehavior
Dim geometryResult As GeometryHitTestResult = CType(result, GeometryHitTestResult)
Dim visual As DrawingVisual = TryCast(result.VisualHit, DrawingVisual)
If visual IsNot Nothing AndAlso geometryResult.IntersectionDetail = IntersectionDetail.FullyInside Then
hits.Add(visual)
MsgBox("Ouch")
End If
Return HitTestResultBehavior.Continue
End Function
End Class
Вот XAML. Я добавил текстовое поле DrawingCanvas, чтобы увидеть, что-то появилось. Ничего. На самом деле, я хочу сделать это в коде, а не в XAML. Я думал, что могу спрятаться или переместить его динамически.
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Music"
Title="MainWindow" Height="539" Width="892">
<DockPanel>
<Menu DockPanel.Dock="Top" Name="MainMenu" VerticalAlignment="Top" Height="25">
<MenuItem Name="File" Header="File">
<MenuItem Name="Open" Header="Bla bla..."/>
</MenuItem>
</Menu>
<local:DrawingCanvas DockPanel.Dock="Bottom" x:Name="drawingSurface" RenderTransformOrigin="0.5,0.5" >
<TextBox Height="0" Name="TextBox1" Width="45" Text="How now brown cow?" />
</local:DrawingCanvas>
</DockPanel>
</Window>
Спасибо, что помогли nooby. Решение было бы очень полезно для меня. Это было легко с формами окон, но мне нужна скорость рисования WPF.
Я не показывал код, который использует DrawingCanvas. \t частного Суб DrawBackground() \t \t С помощью постоянного тока как DrawingContext = visBackground.RenderOpen() \t \t \t Dim кисти, как кисть = Brushes.Cornsilk \t \t \t Dim drawingPen Поскольку Pen = New Pen (Brushes.Cornsilk, 1) \t \t \t dc.DrawRectangle (щетка, drawingPen, New Rect (0, 0, dblScreenWidth, dblScreenHeight)) \t \t End Using \t \t drawingSurface.AddVisual (visBackground) \t End Sub – jokestacker
Не совсем уверен, что вы после. Но я добавил код, который показывает, как добавить материал на ваш холст. – WozzeC