将模板设置为WPF TextBox样式后文本不可见

uubf1zoe  于 2023-03-13  发布在  其他
关注(0)|答案(1)|浏览(255)

我有一个WPF文本框,当我直接在窗口或用户控件中重写其模板时,它正常工作,但当我在资源字典中为它使用样式时,所有属性都工作正常,但当我在样式中设置模板时,文本变得不可见。
这里是风格

<Style x:Key="InputTextBoxes" TargetType="TextBox">
        <Setter Property="IsEnabled" Value="True"/>
        <Setter Property="Foreground" Value="{StaticResource foregroundcolor1}"/>
        <Setter Property="Background" Value="{StaticResource foregroundcolor3}"/>
        <Setter Property="FontSize" Value="16"/>
        <Setter Property="FontWeight" Value="SemiBold"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>

<!-- Here Comes the Issue-->

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border Name="Border" CornerRadius="9" 
                            Background="{TemplateBinding Background}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            BorderBrush="{TemplateBinding Foreground}">
                        <ContentPresenter/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>

下面是文本框中样式的实现

<TextBox Grid.Row="0" 
         Grid.Column="1"
         Name="RevokeUserNameBox"
         Margin="6"
         Style="{StaticResource InputTextBoxes}"
         Text="{Binding RevokeAdminModel.UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

我试着添加ContentPresenter并删除它,但仍然没有成功。我甚至有一些时间与ChatGPT聊天,没有运气。

xlpyo6sf

xlpyo6sf1#

经过一些搜索,我发现这个答案在另一个问题https://stackoverflow.com/a/63362942/13176802
诀窍是我必须

<ScrollViewer Margin="0" x:Name="PART_ContentHost" />

在边框内部,因为这是负责显示文本的部分,正如我从https://learn.microsoft.com/en-us/dotnet/desktop/wpf/controls/textbox-styles-and-templates?view=netframeworkdesktop-4.8中所理解的
最终风格应该是这样的

<Style x:Key="InputTextBoxes" TargetType="TextBox">
        <Setter Property="IsEnabled" Value="True"/>
        <Setter Property="Foreground" Value="{StaticResource foregroundcolor1}"/>
        <Setter Property="Background" Value="{StaticResource foregroundcolor3}"/>
        <Setter Property="FontSize" Value="16"/>
        <Setter Property="FontWeight" Value="SemiBold"/>
        <Setter Property="HorizontalContentAlignment" Value="Left"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border Name="Border" CornerRadius="9" 
                            Background="{TemplateBinding Background}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            BorderBrush="{TemplateBinding Foreground}">
                        <ScrollViewer Margin="0" x:Name="PART_ContentHost" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
</Style>

我希望这能在未来帮助到一些人。

相关问题