【强行操作】为自定义模板化控件添加后台代码
vb.net吧
全部回复
仅看楼主
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
level 13
Nukepayload2 楼主
这有什么用呢?
举个例子,对于Windows 10独占的控件SplitView,用多条件触发器模拟是难以实现的,因为你写出来的多条件触发器容易跟另一个被还原的多条件触发器冲突。
用VisualStateManager理论可以实现,但是由于WPF的VisualStateManager没有StateTrigger,这种实现有一定的局限性,就是只能用动画。你不得不写一些转换器来完成,最后代码特别长。
于是,直接添加的后台代码有用了!既可以模仿这种控件的外观和行为,也可以模仿代码!
2015年08月23日 11点08分 2
level 13
Nukepayload2 楼主
第二步的代码我写在控件原本的后台代码了。
ps: "后台代码"是我直译"code behind"的结果,一些书籍里翻译为"代码隐藏类"
2015年08月23日 11点08分 4
我一直以为是叫代码后置[委屈]
2015年08月24日 11点08分
1