【问题标题】:MultiTrigger not working When Validation.HasError and IsMouseOver in WPF当 WPF 中的 Validation.HasError 和 IsMouseOver 时,MultiTrigger 不起作用
【发布时间】:2014-10-24 08:15:09
【问题描述】:

我有这个TextBox

<TextBox IsEnabled="{Binding IsChecked, ElementName=Cb_AllowDeletingPictures}"
                 Style="{DynamicResource TextBoxInError}">
     <TextBox.Text>
          <Binding Path="TimeBeforeDeletingPicture" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
               <Binding.ValidationRules>
                    <helpers:TimeBeforeDeletingRule/>
               </Binding.ValidationRules>
          </Binding>
     </TextBox.Text>
</TextBox>

TextBoxInError 样式包含 Validation.ErrorTemplate 属性的模板和设置工具提示并将 BorderBrushForeground 变为红色的 MultiTrigger,如下所示:

<Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <DockPanel>
                        <TextBlock Foreground="Red" FontSize="20" FontWeight="Bold" Text="!" FontFamily="Segoe UI Light"></TextBlock>
                        <AdornedElementPlaceholder/>
                    </DockPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="Validation.HasError" Value="True"></Condition>
                    <Condition Property="IsMouseOver" Value="True"></Condition>
                </MultiTrigger.Conditions>
                <Setter Property="Foreground" Value="Red" />
                <Setter Property="BorderBrush" Value="Red"/>
                <Setter Property="ToolTip"
                    Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
            </MultiTrigger>
        </Style.Triggers>
</Style>

现在,正如您在下一个屏幕截图中看到的那样,ErrorTemplate 工作正常,在 TextBox 前显示一个红色感叹号,问题在于:

  • 当鼠标is not overTextBox 时,Foreground 和 BorderBrush 都不是红色的,没关系。
  • 现在当鼠标is over TextBox 区域时,只有前景变为红色,而当鼠标在其上方时,BorderBrush 保持其原始行为。

当鼠标不在文本框区域时:

当鼠标在文本框区域上时:

为什么会有这样的行为,为什么它在 Foreground 而不是 BorderBrush 工作?我错过了什么吗?

【问题讨论】:

    标签: c# .net wpf validation xaml


    【解决方案1】:

    TextBox 的默认模板中,定义了触发器,它在 MouseOver 上将 BorderBrush 设置为您在鼠标悬停时看到的某种蓝色。这就是你的触发器不起作用的原因。您必须覆盖默认模板并删除该触发器以使其工作

    以这样的样式声明模板(我已经从控件模板中删除了默认触发器)

    <Style x:Key="TextBoxInError" TargetType="TextBox">
        <!-- Your other setters -->
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBoxBase">
                    <Border
                        BorderThickness="{TemplateBinding Border.BorderThickness}"
                        BorderBrush="{TemplateBinding Border.BorderBrush}"
                        Background="{TemplateBinding Panel.Background}"
                        Name="border"
                        SnapsToDevicePixels="True">
                        <ScrollViewer
                            HorizontalScrollBarVisibility="Hidden"
                            VerticalScrollBarVisibility="Hidden"
                            Name="PART_ContentHost"
                            Focusable="False" />
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="UIElement.IsEnabled"
                                 Value="False">
                            <Setter Property="UIElement.Opacity"
                                    TargetName="border" 
                                    Value="0.56"/>
                        </Trigger>
                        <Trigger Property="UIElement.IsKeyboardFocused"
                                 Value="True">
                            <Setter Property="Border.BorderBrush"
                                    TargetName="border">
                                <Setter.Value>
                                    <SolidColorBrush>#FF569DE5</SolidColorBrush>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <!-- Your triggers -->
    </Style>
    

    我从默认模板中删除的触发器如下所示:

    <Trigger Property="UIElement.IsMouseOver" Value="True">
        <Setter
            Property="Border.BorderBrush"
            TargetName="border">
            <Setter.Value>
                <SolidColorBrush>#FF7EB4EA</SolidColorBrush>
            </Setter.Value>
        </Setter>
    </Trigger>
    

    【讨论】:

    • Thx @Rohit 我想我找到了我的问题
    猜你喜欢
    • 2012-03-19
    • 2017-02-26
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多