什么原因可以阻止显式和隐式样式的应用?

时间:2011-04-29 11:10:20

标签: wpf debugging xaml resources styles

我有一个WPF测试项目,我用它来回答SO问题,不知何故,这个项目随着时间的推移变得混乱,有些东西不再正常工作。这可能不是真正的问题,因为我可以把它扔掉并创建一个新的但显然在每种情况下都不是一个可行的解决方案所以我认为知道什么会导致这种行为可能会很有趣。

特别令人惊讶的是,即使是显式样式也不适用。例如我有这种风格

<Style x:Key="EnlargeImageStyle" TargetType="{x:Type Image}">
    <Setter Property="LayoutTransform">
        <Setter.Value>
            <ScaleTransform ScaleX="1" ScaleY="{Binding RelativeSource={RelativeSource Self}, Path=ScaleX}"/>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation To="2" Duration="0:0:0.3"
                                     Storyboard.TargetProperty="LayoutTransform.ScaleX"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation To="1" Duration="0:0:0.3"
                                     Storyboard.TargetProperty="LayoutTransform.ScaleX"/>
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>

Window.Resources中定义了哪个,我将它应用于最低限度定义的图像,如下所示:

<Image Width="80" Height="48" Style="{StaticResource EnlargeImageStyle}">
    <Image.Source>
        <BitmapImage UriSource="pack://application:,,,/Images/Img.png"/>
    </Image.Source>
</Image>

它只是不会做任何事情,如果我试图隐含地应用它我也没有结果。

正如标题所述,什么可以阻止显式和隐式样式的应用?

我不想将此限制在我的问题上,任何可能在野外遇到的理由都很好

2 个答案:

答案 0 :(得分:4)

我想要命名的隐式样式有两个常见原因:

目标元素......

  • ...位于DataTemplate或ControlTemplate中(Application.Resources免于此)
  • ...继承自TargetType中指定的类,而不是相同。

答案 1 :(得分:2)

您的代码看起来很好并且应该可以正常工作。请确保没有其他样式或动画没有覆盖您的默认样式。在评估依赖项属性的值时,wpf依赖项属性系统会考虑一些因素,例如从动画中设置的值将具有最高优先级。通过以下链接获取更多信息

http://msdn.microsoft.com/en-us/library/ms743230.aspx

您可以使用Snoop之类的工具在运行时进行调试,以检查实际应用的样式。