如何创建只读TextBox样式



我正在尝试使用以下xaml样式创建一个只读的TextBox,它没有动画或鼠标焦点。然而,我想能够改变背景颜色,但这种风格不允许改变背景颜色。我想我不理解这里的基本概念,因为似乎不可能简单地设置Background属性本身,以同样的方式设置前台属性-为什么是这样,以及我如何创建一个只读的TextBox样式,该样式不会随着鼠标悬停或用户交互而更改,但仍然允许我更改TextBox的每个实例的前景和背景颜色。

编辑也许我不够明确,但据我所知,使用标准的READONLY属性,鼠标光标会改变形状,仍然可以在TextBox中选择文本。我根本不想互动,不想鼠标悬停,不想集中注意力,什么都不想。我会更新我的问题,以明确这一点。

感谢

<Style x:Key="readOnlyTextBoxColor1" 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="MinWidth" Value="120"/>
    <Setter Property="MinHeight" Value="20"/>
    <Setter Property="AllowDrop" Value="False"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="FontSize" Value="36"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="TextWrapping" Value="Wrap"/>
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="IsEnabled" Value="False"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border 
  Name="Border"
  BorderThickness="0" >
                    <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource ThemeSolidColorBrushColor1}"/>
                        <Setter TargetName="Border" Property="BorderBrush" Value="Black"/>
                        <Setter Property="Foreground" Value="{StaticResource ThemeSolidColorBrushWhite}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="True">
                        <Setter TargetName="Border" Property="Background" Value="{StaticResource ThemeSolidColorBrushColor1}"/>
                        <Setter TargetName="Border" Property="BorderBrush" Value="Black"/>
                        <Setter Property="Foreground" Value="{StaticResource ThemeSolidColorBrushDarkGray}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这就是我最终所做的,而且似乎奏效了。如果这是正确的方式,我会感兴趣的。引用TextBoxBase似乎起到了作用,它允许我以通常的方式设置Background和其他属性,并且所有用户交互都保持禁用状态。此外,样式不会因每个状态而改变。

<Style x:Key="staticTextBox" 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="MinWidth"  Value="120" />
    <Setter Property="MinHeight" Value="20" />
    <Setter Property="AllowDrop"  Value="false" />
    <Setter Property="IsReadOnly"  Value="true" />
    <Setter Property="IsEnabled"  Value="false" />
    <Setter Property="FontSize" Value="36"/>
    <Setter Property="FontFamily" Value="Arial"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="TextAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBoxBase}">
                <Border Name="Border"
        CornerRadius="2"
        Padding="2"
        BorderThickness="0" Background="{TemplateBinding Background}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="Disabled">
                            </VisualState>
                            <VisualState x:Name="ReadOnly">
                            </VisualState>
                            <VisualState x:Name="MouseOver" />
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <ScrollViewer Margin="0"
                x:Name="PART_ContentHost" />
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ready只意味着对用户没有交互,即使鼠标悬停事件也不会触发

这样做:

   <Style x:Key="readOnlyTextBoxColor1" 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="MinWidth" Value="120"/>
<Setter Property="MinHeight" Value="20"/>
<Setter Property="AllowDrop" Value="False"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontSize" Value="36"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="TextWrapping" Value="Wrap"/>
<Setter Property="IsReadOnly" Value="True"/>
<Setter Property="IsEnabled" Value="False"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type TextBox}">
            <Border Name="Border" BorderThickness="0" >
                <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
            </Border>
            <ControlTemplate.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter TargetName="Border" Property="Background" Value="{StaticResource ThemeSolidColorBrushColor1}"/>
                    <Setter TargetName="Border" Property="BorderBrush" Value="Black"/>
                    <Setter Property="Foreground" Value="{StaticResource ThemeSolidColorBrushWhite}"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="True">
                    <Setter TargetName="Border" Property="Background" Value="{StaticResource ThemeSolidColorBrushColor1}"/>
                    <Setter TargetName="Border" Property="BorderBrush" Value="Black"/>
                    <Setter Property="Foreground" Value="{StaticResource ThemeSolidColorBrushDarkGray}"/>
                </Trigger>
   <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="Border" Property="Background" Value="{x:Null}"/>
                    <Setter TargetName="Border" Property="BorderBrush" Value="{x:Null}"/>
                    <Setter Property="Foreground" Value="YourColorHere"/>
                    <Setter Property="Cursor" Value="Default"/>
                    <Setter Property="Background" Value="YourColorHere"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Setter.Value>
</Setter>

您可以制作更多触发器,例如:

IsMouseLeave

IsMouseDown

IsMouseMove

IsMouseOver

IsKeyUp

IsKeyDown

您可以使用的任何RoutedEvent,并为每个事件定义setter属性。

希望它能帮助…:)

最新更新