为何为Grid设置的ControlTemplate无法生效?
为什么给Grid设置ControlTemplate无效?
核心原因很简单:Grid并不是Control类的子类,它继承自FrameworkElement,而Control.Template属性是Control专属的——只有继承自Control的控件(比如Button、TextBox、ListBox这类)才有ControlTemplate来替换其可视化树,Grid根本没有这个属性,所以你写的Setter完全不会生效。
你代码里的<Setter Property="Control.Template">本质上是在尝试给一个不存在的属性赋值,WPF会忽略这个无效的Setter,自然看不到你想要的三列布局效果。
正确的实现方式
如果你想给Grid统一设置固定的三列布局,直接在Style里设置Grid的ColumnDefinitions属性就可以了,不需要用ControlTemplate:
<Grid> <Grid.Style> <Style TargetType="Grid"> <Setter Property="ShowGridLines" Value="True"/> <Setter Property="ColumnDefinitions"> <Setter.Value> <ColumnDefinitionCollection> <ColumnDefinition Width="0.1*"/> <ColumnDefinition Width="0.8*"/> <ColumnDefinition Width="0.1*"/> </ColumnDefinitionCollection> </Setter.Value> </Setter> </Style> </Grid.Style> <!-- 这里放Grid的子元素,比如: --> <TextBlock Grid.Column="1" Text="内容区域"/> </Grid>
额外说明
如果你的需求是要自定义一个带固定布局的容器控件(而不是直接用Grid),那可以创建一个继承自Control的自定义控件,然后在它的ControlTemplate里嵌入你的三列Grid,这样就能通过ControlTemplate来控制其可视化结构了。但对于普通的Grid布局需求,直接设置ColumnDefinitions是最直接高效的方式。
内容的提问来源于stack exchange,提问作者Melon NG
相关产品推荐
相关产品推荐

