WPF/Silverlight随笔 CT(二)

我想,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;
    }
}

 

照着WPF=Markup+Code,写了一个Demo:WpfApplication15.zip

posted @   包建强  Views(637)  Comments(1Edit  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示