WPF:如何从模板引发的事件中获取控件的属性值

托尔森64

我需要允许用户垂直调整用户控件的大小。因此,搜索使我得到了一些有关如何使用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属性吗?如果是这样,怎么办?如果没有,替代方案?

托尔森64

天啊!我想到了。一天中的大部分时间都花在我身上,但是终于奏效了。只需找出要使用的正确绑定即可。因此,在我的代码中,我将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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Eloquent模型事件中获取先前的属性值

来自分类Dev

如何在控件模板中获取目标的属性值

来自分类Dev

C#引发控件列表中的事件

来自分类Dev

如何在jquery中获取HiddenFor控件的值

来自分类Dev

在WPF中更改窗口控件模板的内容

来自分类Dev

如何在模板中获取表单值

来自分类Dev

WPF中的“ <控件名称>”错误已注册“获取<属性名称>”

来自分类Dev

如何添加WPF treeView节点单击事件以获取节点值

来自分类Dev

如何获取@HandleBeforeSave事件中的旧实体值以确定属性是否更改?

来自分类Dev

WPF中的自定义控件模板的Click事件

来自分类Dev

在Kendo网格的编辑器模板中获取属性的值

来自分类Dev

如何在angularjs自定义指令的模板中获取属性值?

来自分类Dev

如何从同一控件的丢失焦点事件中将焦点返回到WPF中的控件?

来自分类Dev

如何使用XAML中的通用模板/控件创建可重用控件并设置嵌套控件的属性

来自分类Dev

如何绑定到控件模板内部的控件属性?

来自分类Dev

如何从WPF DataGrid中的“模板”列中获取值。

来自分类Dev

如何在模板中获取JSONfield的值

来自分类Dev

每当更改任何控件时,如何获取引发事件?

来自分类Dev

AngularJS:通过属性从TD中的指令获取文本并通过控制器$ scope中的引发事件?

来自分类Dev

覆盖XAML中的控件模板属性值

来自分类Dev

如何在realEdit控件中获取网格字段的计算值?

来自分类Dev

WPF中的“ <控件名称>”错误已注册“获取<属性名称>”

来自分类Dev

如何获取指令中模板url的html文件中定义的属性值

来自分类Dev

如何添加WPF treeView节点单击事件以获取节点值

来自分类Dev

如何使用XAML中的通用模板/控件创建可重用控件并设置嵌套控件的属性

来自分类Dev

如何从WPF DataGrid中的“模板”列中获取值。

来自分类Dev

如何在模板中获取JSONfield的值

来自分类Dev

如何从 WPF 中的单独窗口引发 Datagrid RowEditEnding 事件?

来自分类Dev

从 WPF 中的主窗口引发用户控件上的事件

Related 相关文章

  1. 1

    在Eloquent模型事件中获取先前的属性值

  2. 2

    如何在控件模板中获取目标的属性值

  3. 3

    C#引发控件列表中的事件

  4. 4

    如何在jquery中获取HiddenFor控件的值

  5. 5

    在WPF中更改窗口控件模板的内容

  6. 6

    如何在模板中获取表单值

  7. 7

    WPF中的“ <控件名称>”错误已注册“获取<属性名称>”

  8. 8

    如何添加WPF treeView节点单击事件以获取节点值

  9. 9

    如何获取@HandleBeforeSave事件中的旧实体值以确定属性是否更改?

  10. 10

    WPF中的自定义控件模板的Click事件

  11. 11

    在Kendo网格的编辑器模板中获取属性的值

  12. 12

    如何在angularjs自定义指令的模板中获取属性值?

  13. 13

    如何从同一控件的丢失焦点事件中将焦点返回到WPF中的控件?

  14. 14

    如何使用XAML中的通用模板/控件创建可重用控件并设置嵌套控件的属性

  15. 15

    如何绑定到控件模板内部的控件属性?

  16. 16

    如何从WPF DataGrid中的“模板”列中获取值。

  17. 17

    如何在模板中获取JSONfield的值

  18. 18

    每当更改任何控件时,如何获取引发事件?

  19. 19

    AngularJS:通过属性从TD中的指令获取文本并通过控制器$ scope中的引发事件?

  20. 20

    覆盖XAML中的控件模板属性值

  21. 21

    如何在realEdit控件中获取网格字段的计算值?

  22. 22

    WPF中的“ <控件名称>”错误已注册“获取<属性名称>”

  23. 23

    如何获取指令中模板url的html文件中定义的属性值

  24. 24

    如何添加WPF treeView节点单击事件以获取节点值

  25. 25

    如何使用XAML中的通用模板/控件创建可重用控件并设置嵌套控件的属性

  26. 26

    如何从WPF DataGrid中的“模板”列中获取值。

  27. 27

    如何在模板中获取JSONfield的值

  28. 28

    如何从 WPF 中的单独窗口引发 Datagrid RowEditEnding 事件?

  29. 29

    从 WPF 中的主窗口引发用户控件上的事件

热门标签

归档