使用焦点和图像设置WPF文本背景色

使用焦点和图像设置WPF文本背景色,wpf,validation,focus,backcolor,Wpf,Validation,Focus,Backcolor,WPF/MVVM模式 <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorC

WPF/MVVM模式

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>
使用验证属性的多个文本框的用户控件。 在下面的样式中,一切都按预期工作-除了那些有验证错误的,由于控件模板中用于设置错误图像的方法,聚焦的背景色没有被设置

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>
如果移除控件模板,则如果设置了验证错误,则在聚焦时正确设置背景色。对于模板,背景色始终为白色/默认值

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>
对XAML有什么建议吗?聚焦时需要有不同的背景色,验证失败时需要有错误图像

<Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="1" />
    <Setter Property="ToolTip" Value="{Binding Description}"/>

    <Style.Triggers>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Background" Value="LightYellow"/>
        </Trigger>

        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip"
                    Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

            <!--adds the error image and border, but also prevents background color change OnFocus-->
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Grid>
                            <Border  
                                    BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                    BorderThickness="2" >
                                <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                            </Border>
                            <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                    Source="/Images/error.png" HorizontalAlignment="Right">
                            </Image>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

您应该退房

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>
这里发生的情况是,您定义的
ControlTemplate
覆盖了前面定义的
样式触发器

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>
要使其正常工作,您可以使用适当的
触发器直接在
控制模板内部设置实际的
样式
否则,正如您所看到的,WPF将只使用
网格的默认模板

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>
代码应该如下所示:

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

<Style.Triggers>

    <Trigger Property="Validation.HasError" Value="true">
        <Setter Property="ToolTip"
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

        <!--adds the error image and border, but also prevents background color change OnFocus-->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                    <Grid.Style>
                      <Style TargetType="{x:Type Grid}">
                        <Style.Triggers>
    <!-- The trigger about IsFocused should be here!
    <Trigger Property="IsFocused" Value="True">
        <Setter Property="Background" Value="LightYellow"/>
    </Trigger>
                        </Style.Triggers>
                      </Style>
                    </Grid.Style>
                        <Border  
                                BorderBrush="#d99" x:Name="textBorder" CornerRadius="4" 
                                BorderThickness="2" >
                            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/>
                        </Border>
                        <Image Name="ErrorImage" Width="24" Height="24" Margin="0,0,4,0"
                                Source="/Images/error.png" HorizontalAlignment="Right">
                        </Image>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>