2017-03-02 37 views
0

代码chnage化背景色后失踪所以这是我TextBox风格:Mahapps文本框风格通过背后

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource MetroTextBox}"> 
    <Setter Property="Foreground" Value="Gainsboro"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="0"/> 
    <Setter Property="Controls:TextBoxHelper.ClearTextButton" Value="True"/> 
    <Setter Property="Padding" Value="0,1,0,0" /> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="Controls:TextBoxHelper.ClearTextButton" Value="True"/> 
     </Trigger> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsEnabled" Value="False" /> 
       <Condition Property="IsMouseOver" Value="False"/> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.Setters> 
       <Setter Property="Background" Value="#FF0052B2"/> 
       <Setter Property="BorderBrush" Value="Transparent"/> 
       <Setter Property="Foreground" Value="Gainsboro"/> 
      </MultiTrigger.Setters> 
     </MultiTrigger> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsEnabled" Value="True" /> 
       <Condition Property="IsMouseOver" Value="False"/> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.Setters> 
       <Setter Property="Foreground" Value="Gainsboro"/> 
       <Setter Property="Background" Value="#FF103766"/> 
       <Setter Property="BorderBrush" Value="Transparent"/> 
      </MultiTrigger.Setters> 
     </MultiTrigger> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsEnabled" Value="True" /> 
       <Condition Property="IsMouseOver" Value="True"/> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.Setters> 
       <Setter Property="Foreground" Value="White"/> 
       <Setter Property="Background" Value="#FF7AA0CD"/> 
       <Setter Property="BorderBrush" Value="White"/> 
      </MultiTrigger.Setters> 
     </MultiTrigger> 
    </Style.Triggers> 
</Style> 

我的控制器:

<TextBox 
    Name="Filter" 
    Width="398" 
    Height="25" 
    TextChanged="tbSnifferFilter_TextChanged"          
    Margin="23,0,0,0"/> 

在我的应用程序,用户需要我TextBox过滤器里面输入(简单的字符串),并通过以下方法我检查此过滤器是否有效,并将颜色更改为GreenRed

private void tbFilter_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    tbFilter.TextChanged -= tbFilter_TextChanged; 

    if (tbFilter.Text == "") // In case user click on clear button - return back to default backgroud color. 
    { 
     tbFilter.Background = (Brush)new BrushConverter().ConvertFromString("#FF103766"); 
     tbFilter.TextChanged += tbFilter_TextChanged; 
     return; 
    } 

    if (!IsSyntaxCurrect(tbFilter.Text)) 
     tbFilter.Background = Brushes.Salmon; 
    else 
     tbFilter.Background = Brushes.MediumSeaGreen; 

    tbFilter.TextChanged += tbFilter_TextChanged; 
} 

private bool IsSyntaxCurrect(string filter) 
{ 
    try 
    { 
     // Do my stuff... 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

因此添加后过滤器(有效OT无效),并在TextBox明确的按钮,用户点击后清洁TextBoxBackground颜色恢复到默认的颜色,但Mouse Over没有工作,什么也不做。

回答

1

这是因为您在事件处理程序中设置的本地Background值优先于您的Style设置的值。请参阅MSDN了解更多信息有关依赖项属性值优先级:https://msdn.microsoft.com/en-us/library/ms743230(v=vs.110).aspx

取而代之的是Background属性设置为一个新的Brush值时TextBox被清除,你可以使用ClearValue方法清除依赖项属性的值:

private void tbFilter_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    tbFilter.TextChanged -= tbFilter_TextChanged; 

    if (tbFilter.Text == "") // In case user click on clear button - return back to default backgroud color. 
    { 
     tbFilter.ClearValue(TextBox.BackgroundProperty); //<-- 
     tbFilter.TextChanged += tbFilter_TextChanged; 
     return; 
    } 

    if (!IsSyntaxCurrect(tbFilter.Text)) 
     tbFilter.Background = Brushes.Salmon; 
    else 
     tbFilter.Background = Brushes.MediumSeaGreen; 

    tbFilter.TextChanged += tbFilter_TextChanged; 
}