level 13
Nukepayload2
楼主
感觉WPF的触发器不给力,想给自定义的模板化控件添加后台代码?
没问题!不需要写各种IValueConverter什么的,我来教大家直接处理!
第一步是获取\Themes\Generic.xaml里面模板化控件的根元素
Private Function GetTemplateRootFromResourceDictionary(StyleTargetType As Type) As FrameworkElement
Return DirectCast((Aggregate a In From s In DirectCast(Application.Current.FindResource(StyleTargetType), Style).Setters Let se = DirectCast(s, Setter) Where se.Property Is TemplateProperty Select DirectCast(se.Value, ControlTemplate) Into First).LoadContent, FrameworkElement)
End Function
第二步是利用根元素找里面的有x:Name的子元素。Root就是上一个函数的结果。
Private Function FindNameEx(Root As FrameworkElement, Name As String) As FrameworkElement
For i = 0 To VisualTreeHelper.GetChildrenCount(Root) - 1
Dim el = DirectCast(VisualTreeHelper.GetChild(Root, i), FrameworkElement)
If el.Name = Name Then
Return el
Else
Return FindNameEx(el, Name)
End If
Next
Return Nothing
End Function
找到子元素,模板就任我们摆布了!
2015年08月23日 11点08分
1
没问题!不需要写各种IValueConverter什么的,我来教大家直接处理!
第一步是获取\Themes\Generic.xaml里面模板化控件的根元素
Private Function GetTemplateRootFromResourceDictionary(StyleTargetType As Type) As FrameworkElement
Return DirectCast((Aggregate a In From s In DirectCast(Application.Current.FindResource(StyleTargetType), Style).Setters Let se = DirectCast(s, Setter) Where se.Property Is TemplateProperty Select DirectCast(se.Value, ControlTemplate) Into First).LoadContent, FrameworkElement)
End Function
第二步是利用根元素找里面的有x:Name的子元素。Root就是上一个函数的结果。
Private Function FindNameEx(Root As FrameworkElement, Name As String) As FrameworkElement
For i = 0 To VisualTreeHelper.GetChildrenCount(Root) - 1
Dim el = DirectCast(VisualTreeHelper.GetChild(Root, i), FrameworkElement)
If el.Name = Name Then
Return el
Else
Return FindNameEx(el, Name)
End If
Next
Return Nothing
End Function
找到子元素,模板就任我们摆布了!
