通过

时间:2017-03-02 11:00:03

标签: wpf textbox styles mahapps.metro

所以这是我的TextBox风格:

<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过滤器(简单字符串),并通过以下方法检查此过滤器是否有效并更改我的TextBox {{1 }}颜色为BackgroudGreen

Red

所以在添加过滤器(有效ot无效)后,用户点击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; } } 清除按钮清除TextBox TextBox颜色返回默认颜色但{{1不工作,什么都不做。

1 个答案:

答案 0 :(得分:1)

这是因为您在事件处理程序中设置的本地Background值优先于Style设置的值。有关依赖项属性值优先级的更多信息,请参阅MSDN:enter image description here

在清除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;
}