我想,Silverlight只是WPF的一个子集,很多WPF的功能,在SL中并没有,比如说TemplateSelector,比如说Relative绑定。于是,我们只好采用AttachedBehavior来模拟。
这样最好,最灵活,需要什么,就添加相应的DP,使得SL类库最小化。
所有派生自ContentControl的类型,都使用ContentPresenter来显示它们的内容,比如说下面的CT:
<ControlTemplate x:Key="newRadio" TargetType="{x:Type RadioButton}">
<Border Name="border" BorderBrush="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" Padding="10" CornerRadius="100">
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" />
</Border>
可以改写为
<ControlTemplate x:Key="newRadio" TargetType="{x:Type RadioButton}">
<Border Name="border" BorderBrush="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" Padding="10" CornerRadius="100">
<ContentPresenter />
</Border>
这时,绑定会自动发生。ContentPresenter 相当于一个占位符,把它放在那里,就代表着一个ContentControl.Content。
注:<ContentPresenter Content="{TemplateBinding ContentControl.Content}" />还可以改为<ContentPresenter Content="{TemplateBinding Content}" />
土人才会用TextBlock,那个太慢了。
使用CT后,就相当于把控件原先的默认模板冲掉了。这时,即使之前指定了控件的若干属性,也都会失效,因为控件的外观发生了变化。
但是,控件上的事件不会被冲掉,仍然会被触发,因为WPF中的事件是基于RoutedEventArgs机制的。
ControlTemplate和DataTemplate都是从FrameworkTemplate派生的。
谁说foreach和Remove方法不能一起使用:
for (int i = 0; i < grid.Children.Count; i++)
{
if (Grid.GetRow(grid.Children[i]) == 0)
{
grid.Children.Remove(grid.Children[i]);
break;
}
}