Триггеры стилей WPF: могу ли я применить один стиль для множества свойств? - PullRequest
1 голос
/ 13 марта 2010

Кажется, должен быть способ сделать это:

Я применяю ItemContainerStyle в моем Listbox на основе двух триггеров свойств. Как видите, я использую один и тот же набор триггерных действий ввода / вывода, просто применяемых к двум различным свойствам. Есть что-то эквивалентное ??? (Очевидно, это не выглядело бы так, но, вероятно, это и понятно.)

<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="IsKeyboardFocusWithin" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height"
                                        To="50" Duration="0:0:.3"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height"
                                              To="25" Duration="0:0:.3" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>


            </Style.Triggers>


   </Style>
<Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height"
                                        To="50" Duration="0:0:.3"></DoubleAnimation>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Height"
                                              To="25" Duration="0:0:.3" />
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>


            </Style.Triggers>
</Style>

Ответы [ 2 ]

1 голос
/ 13 марта 2010

Пробовали ли вы выполнить одно из следующих действий (извлечено из книги Адама Натана: Windows Presentation Foundation Unleashed ):

  • Несколько триггеров, примененных к одному элементу (чтобы получить логическое ИЛИ).
  • Несколько свойств оцениваются для одного и того же триггера (чтобы получить логическое И).

Логическое ИЛИ

Поскольку Style.Triggers могут содержать несколько триггеров, вы можете создать более одного с одинаковыми Setters для выражения логического отношения OR.

Например:

<Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
        ...
    </Trigger>
    <Trigger Property="IsKeyboardFocusWithin" Value="True">
        ....
    </Trigger>
</Style.Triggers>

Это означает, что «если IsMouseOver истинно или , если IsKeyboardFocusWithin истинно, применить действие.

Логическое И

Для выражения логического отношения И можно использовать вариант Триггер , называемый MultiTrigger , или вариант DataTrigger , называемый MultiDataTrigger . Оба триггера имеют коллекцию условий , которая содержит информацию, которую вы обычно помещаете непосредственно в триггер или DataTrigger.

Например:

<Style.Triggers>
    <MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Property="IsKeyboardFocusWithin" Value="True"/>
    </MultiTrigger.Conditions>
    </MultiTrigger>
        <Setter ...>
        <Setter ...>
</Style.Triggers>
0 голосов
/ 01 апреля 2010

Вы можете поместить раскадровки в ресурсы и просто ссылаться на них в триггерах. Это не совсем то, что вам нужно, но позволяет вам определять анимацию в одном центральном месте (вместо того, чтобы копировать и вставлять ее).

<Style TargetType="...">
    <Style.Resources>
        <Storyboard x:Key="MyGetFocusAnimation">
            <DoubleAnimation Storyboard.TargetProperty="Height"
                             To="50" Duration="0:0:.3" />
        </Storyboard>
        <Storyboard x:Key="MyLoseFocusAnimation">
            <DoubleAnimation Storyboard.TargetProperty="Height"
                             To="25" Duration="0:0:.3" />
        </Storyboard>
    </Style.Resources>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource MyGetFocusAnimation}" />
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard Storyboard="{StaticResource MyLoseFocusAnimation}" />
            </Trigger.ExitActions>
        </Trigger>
        <Trigger Property="IsKeyboardFocusWithin" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard Storyboard="{StaticResource MyGetFocusAnimation}" />
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard Storyboard="{StaticResource MyLoseFocusAnimation}" />
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>
...