Стили WPF, на основе и раскадровки - PullRequest
1 голос
/ 23 сентября 2009

Я пытаюсь создать простой стиль, который выделяет сфокусированный элемент пользовательского интерфейса (текстовое поле, комбо и т. Д.), Когда он имеет фокус, и исчезает при потере фокуса.

Я придумал это: `

    <Style TargetType="{x:Type FrameworkElement}" x:Key="OnFocus">
        <Setter Property="Effect">
            <Setter.Value>
                <DropShadowEffect Color="Red" 
                        BlurRadius="0" 
                        ShadowDepth='0' />
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="UIElement.GotFocus">
                    <BeginStoryboard  Name="highlight">
                        <Storyboard>
                            <DoubleAnimation  
              Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)" 
                           To="8" 
                           Duration="0:0:0.5" />
                        </Storyboard>
                    </BeginStoryboard>

                </EventTrigger>
            <EventTrigger RoutedEvent="UIElement.LostFocus">
                <RemoveStoryboard  BeginStoryboardName="highlight"></RemoveStoryboard>
            </EventTrigger>

        </Style.Triggers>


    </Style>`

Но если я попытаюсь создать простые стили BasedOn, он не сможет найти BeginStoryboardName = "highlight", поэтому каждый из элементов в итоге получит весь Style.Triggers.

Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 23 сентября 2009

Поскольку стили не наследуются, как наследование ОО, вложенный стиль не может найти раскадровку в своей области видимости.

Самый простой способ выполнить выделение - добавить вторую раскадровку, которая переворачивает выделение.

<Storyboard x:Key="startHighlight" >
            <DoubleAnimation
                Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)"
                To="8"
                Duration="0:0:0.5" />
        </Storyboard>
        <Storyboard x:Key="reverseHighlight"  >
            <DoubleAnimation
                Storyboard.TargetProperty="(UIElement.Effect).(DropShadowEffect.BlurRadius)"
                To="0"
                Duration="0:0:0.2" />
        </Storyboard>

        <Style TargetType="{x:Type FrameworkElement}">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect Color="Red"
                                      BlurRadius="0"
                                      ShadowDepth="0" />
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <EventTrigger RoutedEvent="UIElement.GotFocus">
                    <BeginStoryboard  Storyboard="{StaticResource startHighlight}">
                    </BeginStoryboard>
                </EventTrigger>
                <EventTrigger RoutedEvent="UIElement.LostFocus">
                    <BeginStoryboard Storyboard="{StaticResource reverseHighlight}">
                    </BeginStoryboard>
                </EventTrigger>
            </Style.Triggers>
        </Style>
        <Style BasedOn="{StaticResource {x:Type FrameworkElement}}" TargetType="{x:Type TextBox}">

        </Style>
...