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

WINUI 3自定义带左侧图标的TextBox无法输入内容问题求助

解决WINUI中带左侧图标输入框无法输入的问题

你实现的带左侧图标的TextBox视觉效果符合预期,但无法输入内容,核心问题出在模板布局和PART_ContentHost的空间分配上。

问题根源

  1. 原模板用StackPanel作为容器,它不会自动将剩余空间分配给内部的ScrollViewer,导致输入区域没有可交互的空间。
  2. Border作为独立元素放在Grid里,没有作为布局根节点,可能导致焦点获取异常。

修正后的TextBox代码

<TextBox Width="250" Height="32" IsEnabled="True">
    <TextBox.Template>
        <ControlTemplate TargetType="TextBox">
            <!-- Border作为根元素,确保布局和焦点区域正确 -->
            <Border Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    CornerRadius="5">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <!-- 图标列占自动宽度 -->
                        <ColumnDefinition Width="Auto"/>
                        <!-- 输入区域占剩余全部宽度 -->
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <!-- 左侧图标 -->
                    <TextBlock FontFamily="Segoe MDL2 Assets" 
                               Text="&#xF180;" 
                               FontSize="16" 
                               Margin="15,0,5,0" 
                               VerticalAlignment="Center"/>
                    <!-- 输入内容容器,必须命名为PART_ContentHost,且占据剩余空间 -->
                    <ScrollViewer x:Name="PART_ContentHost" 
                                  Grid.Column="1" 
                                  Margin="0,0,15,0" 
                                  VerticalAlignment="Center"/>
                </Grid>
            </Border>
        </ControlTemplate>
    </TextBox.Template>
</TextBox>

密码框(PasswordBox)的实现

如果需要做密码输入框,只需要替换控件类型,模板逻辑一致:

<PasswordBox Width="250" Height="32" IsEnabled="True">
    <PasswordBox.Template>
        <ControlTemplate TargetType="PasswordBox">
            <Border Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    CornerRadius="5">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <!-- 密码图标 -->
                    <TextBlock FontFamily="Segoe MDL2 Assets" 
                               Text="&#xF1F9;" 
                               FontSize="16" 
                               Margin="15,0,5,0" 
                               VerticalAlignment="Center"/>
                    <ScrollViewer x:Name="PART_ContentHost" 
                                  Grid.Column="1" 
                                  Margin="0,0,15,0" 
                                  VerticalAlignment="Center"/>
                </Grid>
            </Border>
        </ControlTemplate>
    </PasswordBox.Template>
</PasswordBox>

关键修正点

  • 用Grid替代StackPanel:通过列定义精确分配图标和输入区域的空间,确保输入区域能占据剩余宽度。
  • 将Border作为模板根元素:保证点击输入框时能正确获取焦点,同时统一背景和边框样式。
  • 正确设置PART_ContentHost的位置:让它处于输入区域,确保用户输入的内容能正确显示和交互。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:44:50