WPF 自定义文本框大小调整问题

问题描述 投票:0回答:1

我正在尝试在 WPF 中创建自定义文本框模板。

我的文本框周围有一个 1px 边框,这个边框的边距为 8px,这都是简单的东西,这里没有问题。

我遇到的问题是,当我使用 TextBox 并定义时:

<TextBox Template="MyTextBoxTemplate" Height="100">

Height set at 100, output height 84

边框的实际输出高度只有 84px,我猜是因为当我设置高度时,还包括顶部和底部边距 (2 x 8px) 16px - 但我说 TextBox 应该是 100px 高,这就是我的想要输出。

我尝试在模板中根据

{TemplateBinding Height}
设置边框的高度,但随后边框的底部被修剪:

Border height set to 100, border trimmed

这是我一直在使用的基本代码,我有一些更详细的代码,但我已经回到基础知识来尝试解决这个尺寸问题:

<ControlTemplate TargetType="{x:Type TextBoxBase}">

    <ContentControl Margin="8">

        <Border Background="White"
                BorderBrush="red"
                BorderThickness="1"
                CornerRadius="2"
                Height="{TemplateBinding Height}"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch">

                <Label Content="Text Area..." />

        </Border>

    </ContentControl>

</ControlTemplate>

我之前没有使用内容控件,这只是我尝试解决此问题的最新容器。

wpf templates textbox border
1个回答
0
投票

ControlTemplate 的顶级元素上不应有任何(固定)边距。边距应在文本框上定义,例如默认样式:

<Style TargetType="TextBox">
    <Setter Property="Margin" Value="8"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="BorderBrush" Value="Red"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <ScrollViewer x:Name="PART_ContentHost"
                        Margin="{TemplateBinding Padding}"
                        HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
© www.soinside.com 2019 - 2024. All rights reserved.