WPF не распознает статический ресурс Red в виде красной кисти в состоянии триггера

Я получил этот TextBlock:

<TextBlock Foreground="Red"/>

И есть неявный стиль для TextBlock с триггером стиля, который спрашивает, "если передний план равен {StaticResource BrushTextBlockAlertForeground}, тогда установите фон в черный цвет". (BrushTextBlockAlertForeground, конечно, красный).

<Trigger Property="Foreground" Value="{StaticResource BrushTextBlockAlertForeground}">
    <Setter Property="Background" Value="Black"/>
</Trigger>

Это условие триггера не выполняется! Если статический ресурс разрешен при загрузке, то почему этот триггер не работает? Разве загрузчик XAML не должен помещать красный в состояние триггера? или вместо этого ставится какое-то выражение? Есть ли вероятность того, что это произойдет, потому что свойство "Значение" условия триггера не является свойством зависимости?

Только когда я пишу

<Trigger Property="Foreground" Value="Red">
    <Setter Property="Background" Value="Black"/>
</Trigger>

Оно работает.

Если я добавлю статический ресурс извне (смотри ниже), он ни в коем случае не будет работать. Как это:

<TextBlock Foreground="{StaticResource BrushTextBlockAlertForeground}"/>

Я хотел бы знать причину, потому что я хочу написать многоразовый цвет вместо того, чтобы помещать "красный" во многих местах."Завтра" кто-то попытается сделать это многоразовым и столкнется с поведением, которое я испытываю.

1 ответ

Решение

Убедитесь, что тестируемые TextBlocks и StyleTrigger используют (!) Одну и ту же кисть Red или из StaticResource. TextBlock с красным цветом переднего плана и StyleTrigger с StaticResource и наоборот не будут работать, поскольку значения Brushes.Red и StaticResource не равны. См. A: Как сравнить SolidColorBrushes?

<StackPanel>
            <!--this doesn't work-->
            <StackPanel.Resources>
                <SolidColorBrush x:Key="forebr" Color="Red"/>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="Foreground" Value="{StaticResource forebr}">
                            <Setter Property="Background" Value="Black"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Resources>
            <TextBlock Foreground="Red" Text=" Test trigger 0"></TextBlock>
        </StackPanel>

        <StackPanel>
            <!--this doesn't work-->
            <StackPanel.Resources>
                <SolidColorBrush x:Key="forebr" Color="Red"/>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="Foreground" Value="Red">
                            <Setter Property="Background" Value="Black"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Resources>
            <TextBlock Foreground="{StaticResource forebr}" Text=" Test trigger 1"></TextBlock>
        </StackPanel>

        <StackPanel>
            <!--this works-->
            <StackPanel.Resources>
                <SolidColorBrush x:Key="forebr" Color="Red"/>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="Foreground" Value="{StaticResource forebr}">
                            <Setter Property="Background" Value="Black"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Resources>
            <TextBlock Foreground="{StaticResource forebr}" Text=" Test trigger 2"></TextBlock>
        </StackPanel>

        <StackPanel>
            <!--this works-->
            <StackPanel.Resources>
                <Style TargetType="TextBlock">
                    <Style.Triggers>
                        <Trigger Property="Foreground" Value="Red">
                            <Setter Property="Background" Value="Black"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </StackPanel.Resources>
            <TextBlock Foreground="Red" Text=" Test trigger 3"></TextBlock>
        </StackPanel>
Другие вопросы по тегам