如何在自定义WPF文本框中显示插入符号

时间:2014-06-13 12:09:54

标签: .net wpf styles wpf-controls custom-controls

我通过创建自己的自定义控件模板在WPF中设计了自己的文本框。但是,我似乎无法让插入符号出现。

这是我的TextBox样式:

<Style TargetType="{x:Type TextBox}">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="AllowDrop" Value="True"/>
        <Setter Property="TextBlock.Foreground" Value="DeepSkyBlue"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border
                        Name="border"
                        CornerRadius="0"
                        Padding="2"
                        BorderThickness="1"
                        BorderBrush="DeepSkyBlue">
                        <ContentPresenter
                            HorizontalAlignment="Left" 
                            VerticalAlignment="Top"
                            Content="{TemplateBinding Text}"
                            Name="content"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="True">
                            <Setter Property="Background" Value="MidnightBlue"/>
                            <Setter Property="BorderBrush" Value="DeepSkyBlue"/>
                            <Setter Property="Foreground" Value="DeepSkyBlue"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

那么如何才能让我的插图出现?我希望它是MidnightBlue所以它在DeepSkyBlue背景上可见。

2 个答案:

答案 0 :(得分:3)

虽然问题作者已经为他们的问题提供了解决方案,但此解决方案可能无法解决其他用户的问题。可能导致TextBox中的插入符号消失的另一个原因是,您将TextBox.Background属性设置为{x:Null}Transparent

这是因为WPF框架将插入符的颜色设置为与Background属性中的颜色集相反。由于这两个值没有相反的值,因此插入符颜色设置为Black。这些情况下的解决方案非常简单。

我们可以将Background属性的颜色设置为我们想要插入符号的相反颜色,但是然后将声明颜色的alpha值设置为00。例如,如果你想要一个白色插入符号,那么将TextBox.Background属性设置为#00000000(透明黑色),如果你想要一个红色插入符号,那么将TextBox.Background属性设置为{{1 (透明青色)等。

答案 1 :(得分:2)

TextBox模板需要命名部分PART_ContentHost,因此您需要替换ContentPresenter

<ControlTemplate TargetType="{x:Type TextBox}">
   <Border Name="border" CornerRadius="0" Padding="2" BorderThickness="1" BorderBrush="DeepSkyBlue">
      <ScrollViewer x:Name="PART_ContentHost"/>
   </Border>
   <ControlTemplate.Triggers>
      <Trigger Property="IsEnabled" Value="True">
         <Setter Property="Background" Value="MidnightBlue"/>
         <Setter Property="BorderBrush" Value="DeepSkyBlue"/>
         <Setter Property="Foreground" Value="DeepSkyBlue"/>
      </Trigger>
   </ControlTemplate.Triggers>
</ControlTemplate>

TextBox Styles and Templates

  

PART_ContentHost 可包含FrameworkElement的可视元素。 TextBox的文本显示在此元素中。