You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF自定义TextBox样式后输入文本不显示问题求助

WPF自定义TextBox样式文本不显示问题解决方案

你的问题核心是自定义ControlTemplate中缺少承载文本的核心元素:TextBox的默认模板依赖名为PART_ContentHost的ScrollViewer来渲染和编辑文本,你完全替换模板后只保留了Border,导致文本仅在后台存在,界面无法显示。

以下是修正后的完整代码:

<Window.Resources>
    <Style x:Key="txtBoxStyle" TargetType="{x:Type TextBox}">
        <Setter Property="Background" Value="White"/>
        <Setter Property="TextWrapping" Value="Wrap"/>
        <Setter Property="BorderThickness" Value="2"/>
        <Setter Property="BorderBrush" Value="Blue"/>
        <Setter Property="Padding" Value="6 3"/>
        <Setter Property="FontFamily" Value="Verdana"/> <!-- 修正拼写错误:原Verdane改为Verdana -->
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="FontSize" Value="12"/>
        <Setter Property="Foreground" Value="Black"/>
        <Setter Property="Cursor" Value="IBeam"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBox">
                    <Border x:Name="border" 
                            Background="{TemplateBinding Background}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            CornerRadius="5" 
                            SnapsToDevicePixels="True">
                        <!-- 关键:添加文本承载元素,必须使用PART_ContentHost命名 -->
                        <ScrollViewer x:Name="PART_ContentHost" 
                                      Focusable="false"
                                      HorizontalScrollBarVisibility="Hidden"
                                      VerticalScrollBarVisibility="Hidden"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderBrush" TargetName="border" Value="Blue"/>
                        </Trigger>
                        <!-- 移除重复的IsMouseOver触发器 -->
                        <Trigger Property="IsKeyboardFocused" Value="True">
                            <Setter Property="BorderBrush" TargetName="border" Value="DarkBlue"/> <!-- 可选:添加焦点状态样式 -->
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid>
    <StackPanel>
        <TextBox Name="txt_1"  Height="100" Width="100" Style="{DynamicResource txtBoxStyle}" FontWeight="Bold" Panel.ZIndex="5" />
        <Button x:Name="btn_Tikla" Width="100" Height="100" Background="Blue" Click="btn_Tikla_Click"/>
    </StackPanel>
</Grid>

关键改动说明:

  • 添加了PART_ContentHost命名的ScrollViewer:这是WPF控件模板的约定,TextBox会自动识别并将文本内容绑定到这个元素,是显示文本的核心。
  • 绑定Border的Background、BorderThickness、BorderBrush到模板父级的对应属性:让Style中设置的属性能正确作用到Border上,保持样式一致性。
  • 移除了重复的IsMouseOver触发器,避免冗余代码。
  • 修正了FontFamily的拼写错误(原Verdane改为Verdana)。
  • 可选添加了IsKeyboardFocused触发器,优化焦点状态下的视觉反馈。

内容的提问来源于stack exchange,提问作者YETİ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:30:36