2014-08-30 60 views
0

我有這個TextBoxMultiTrigger不工作時Validation.HasError和IsMouseOver在WPF

<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> 

的​​風格包含了Validation.ErrorTemplate財產和使用模板來MultiTrigger,設置一個工具提示和轉動BorderBrushForeground紅色,這是它的樣子:

<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工作得很好呈現出紅色驚歎號標記文本框之前,問題是:

  • 當鼠標is not over文本框,無論是前景還是在BorderBrush是紅色的,這就是好的。
  • 現在鼠標is over TextBox的區域中,只有前景變爲紅色,而BorderBrush在鼠標懸停時保持其原始行爲。

當鼠標是不是在文本框區域:

When not MouseOver

當鼠標在文本框區域:

When isMouseOver

爲什麼有這樣的行爲,爲什麼它在前臺而不是爲了工作BorderBrush?我錯過了什麼嗎?

回答

2

默認的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> 
+0

Thx @Rohit我想我找到了什麼是我的問題 – AymenDaoudi 2014-08-30 17:08:34