首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当MultiTrigger和IsMouseOver在WPF中运行时,IsMouseOver不能工作

当MultiTrigger和IsMouseOver在WPF中运行时,IsMouseOver不能工作
EN

Stack Overflow用户
提问于 2014-08-30 14:00:36
回答 1查看 1.1K关注 0票数 0

我有一个TextBox

代码语言:javascript
复制
<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,如下所示:

代码语言:javascript
复制
<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 over TextBox时,前景和BorderBrush都不是红色的,这很好。
  • 现在,当鼠标is over TextBox的区域时,只有前景变为红色,而当鼠标在其上方时,BorderBrush保持其原始行为。

当鼠标不在TextBox区域上时:

当鼠标越过TextBox区域时:

为什么会有这样的行为,为什么它是为前景而不是为BorderBrush工作呢?我漏掉了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-30 14:14:40

在TextBox的默认模板中,触发器被定义为在MouseOver上将BorderBrush设置为在鼠标上看到的蓝色。这就是为什么你的扳机不起作用。您必须重写默认模板并删除该触发器以使其工作

以如下方式声明模板(我已经从控件模板中删除了默认触发器)

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<Trigger Property="UIElement.IsMouseOver" Value="True">
    <Setter
        Property="Border.BorderBrush"
        TargetName="border">
        <Setter.Value>
            <SolidColorBrush>#FF7EB4EA</SolidColorBrush>
        </Setter.Value>
    </Setter>
</Trigger>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25583157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档