我需要允许用户垂直调整用户控件的大小。因此,搜索使我得到了一些有关如何使用Thumb类和模板的示例。因此,我设置了模板:
<UserControl.Resources>
<!-- ResizeDecorator Template -->
<ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}">
<Grid>
<t:ResizeThumb Height="3" Cursor="ScrollNS" VerticalAlignment="Bottom" Margin="0 0 0 -4" ItemResizeCompleted="ResizeThumb_ItemResizeCompleted" />
</Grid>
</ControlTemplate>
<!-- Designer Item Template-->
<ControlTemplate x:Key="DesignerItemTemplate" TargetType="ContentControl">
<Grid DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
<Control Template="{StaticResource ResizeDecoratorTemplate}" />
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" />
</Grid>
</ControlTemplate>
</UserControl.Resources>
然后,我设置ResizeThumb类:
Public Class ResizeThumb
Inherits Thumb
Public Event ItemResizeCompleted(sender As Object, e As TimeSlotPanelItemResizeEventArgs)
Public Property id As Integer
Public Sub New()
AddHandler DragDelta, AddressOf ResizeThumb_DragDelta
End Sub
Private Sub ResizeThumb_DragDelta(sender As Object, e As DragDeltaEventArgs)
e.Handled = True
End Sub
Private Sub ItemResized(sender As Object, e As DragCompletedEventArgs) Handles Me.DragCompleted
Dim rs As ResizeThumb = CType(sender, ResizeThumb)
Dim gd As Grid = CType(rs.Parent, Grid)
Dim ee As New TimeSlotPanelItemResizeEventArgs
ee.id = id
ee.ResizeValue = e.VerticalChange
RaiseEvent ItemResizeCompleted(Me, ee)
End Sub
End Class
我的UserControls是动态添加的,因此我在运行时添加了模板:
Dim si As New SchedItem(id, StartTime, Duration, SO, Title, UnitOfWork, BackgroundColor, Status, LastNote, Miles, Hours)
Dim cc As ContentControl = New ContentControl
cc.Content = si
cc.Template = FindResource("DesignerItemTemplate")
每个SchedItem都有一个ID。由于ResizeThumb类具有DragComplete事件,因此我提出了一个事件以传递回VerticalChange,并且我还希望传递已调整大小的SchedItem的ID。我尝试将其绑定到TemplatedParent,但不允许这样做。ResizeThumb唯一的父级是Grid。我尝试将网格的标签绑定到TemplatedParent,但标签中什么也没有。
所以现在我要问;有什么方法可以从ResizeThumb类的ItemResized事件处理程序访问SchedItem的id属性吗?如果是这样,怎么办?如果没有,替代方案?
天啊!我想到了。一天中的大部分时间都花在我身上,但是终于奏效了。只需找出要使用的正确绑定即可。因此,在我的代码中,我将ContentControl的Tag设置为id。
Dim cc As ContentControl = New ContentControl
cc.Tag = id '<-- right here
cc.Content = si
cc.Template = FindResource("DesignerItemTemplate")
然后在XAML中,弄清楚如何将该标签绑定到包含ResizeThumb类的Tag属性的Grid上。
<!-- ResizeDecorator Template -->
<ControlTemplate x:Key="ResizeDecoratorTemplate" TargetType="{x:Type Control}">
<Grid Tag="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=Tag}">
<t:ResizeThumb Height="3" Cursor="ScrollNS" VerticalAlignment="Bottom" Margin="0 0 0 -4" ItemResizeCompleted="ResizeThumb_ItemResizeCompleted" />
</Grid>
</ControlTemplate>
现在在ItemResized事件中,我可以到达发送方的父级网格,并将Tag分配给事件的ID。
Private Sub ItemResized(sender As Object, e As DragCompletedEventArgs) Handles Me.DragCompleted
Dim rs As ResizeThumb = CType(sender, ResizeThumb)
Dim gd As Grid = CType(rs.Parent, Grid)
Dim ee As New TimeSlotPanelItemResizeEventArgs
ee.id = gd.Tag
ee.ResizeValue = e.VerticalChange
RaiseEvent ItemResizeCompleted(Me, ee)
End Sub
现在,我在活动中获取了ID。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句