WPF自定义TextBox模板尺寸异常问题求助
WPF自定义TextBox模板高度问题解决方案
问题原因分析
- WPF控件的
Height指的是整个控件的外部总尺寸,包含模板内部的Margin、Padding等布局空间。你在模板的ContentControl上设置Margin="8",会让内部Border的可用高度被压缩为TextBox.Height - 8*2 = 100-16=84px,这就是边框高度仅为84px的核心原因。 - 直接给
Border绑定{TemplateBinding Height}会强制边框高度为100px,但ContentControl的可用高度只有84px,超出部分自然会被裁剪。
针对性解决方案
场景1:TextBox的Height等于边框高度,8px是控件与其他元素的外部间距
不要在模板内部设置Margin,而是在使用TextBox时添加外部间距:
<ControlTemplate TargetType="{x:Type TextBoxBase}"> <Border Background="White" BorderBrush="red" BorderThickness="1" CornerRadius="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Label Content="Text Area..." /> </Border> </ControlTemplate>
使用时设置外部Margin:
<TextBox Height="100" Margin="8" Template="{StaticResource YourCustomTextBoxTemplate}" />
场景2:边框与TextBox控件边缘之间有8px内部空白,TextBox的Height包含该空白
用Padding替代Margin实现内部空白,模板根元素使用Grid(无需嵌套ContentControl):
<ControlTemplate TargetType="{x:Type TextBoxBase}"> <Grid Padding="8"> <Border Background="White" BorderBrush="red" BorderThickness="1" CornerRadius="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Label Content="Text Area..." /> </Border> </Grid> </ControlTemplate>
此时设置TextBox.Height="100",边框高度为100-8*2=84px,控件总高度保持100px,同时边框与控件边缘保留8px空白。
额外提示
- 模板内部的空白优先用
Padding实现,Margin是用于控件之间的外部间距,避免混淆使用。 - 无需额外嵌套
ContentControl,直接用Grid或Border作为模板根元素,减少布局层级提升性能。
内容的提问来源于stack exchange,提问作者Richard Gale
相关产品推荐
相关产品推荐

