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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架