代码之家  ›  专栏  ›  技术社区  ›  Larry

WPF样式、basedon和故事板

  •  1
  • Larry  · 技术社区  · 15 年前

    我正在尝试创建一个简单的样式,它在聚焦时突出显示聚焦的UI元素(文本框、组合框等),并在失去焦点时消失。

    我想到了这个:`

        <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 回复  |  直到 13 年前
        1
  •  1
  •   Marc    15 年前

    因为样式不是像OO继承那样继承的,所以嵌套样式在其范围内找不到故事板。

    完成突出显示的最简单方法是添加第二个故事板,它反转突出显示。

    <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>