WPF在vb.net中覆盖声明的样式

时间:2013-08-31 06:45:46

标签: wpf styles foreground

我已宣布以下风格。如何在我的vb.net中动态覆盖样式前景色?

<Style x:Key="LabelWinner" TargetType="{x:Type Label}">
        <Setter Property="Effect">
            <Setter.Value>
                <DropShadowEffect Color="#FF000000" ShadowDepth="6" />
            </Setter.Value>
        </Setter>
        <Setter Property="Foreground" Value="#FFFF0000"/>
    </Style>

1 个答案:

答案 0 :(得分:1)

正如评论@nit中所述,在WPF中,Style.Triggers具有强大的系统行为属性。

早些时候,在WinForms更改特定属性时,我们必须通过不太舒适和实用的代码来完成。 WPF的开发人员决定将与程序外观相关的可视逻辑与业务逻辑分开,后者包含程序所需的行为。实际上,它是Style

要设置Style触发器,您需要选择适当的属性。触发器如下:

<Trigger Property="SomeProperty" Value="SomeValue">

... Some actions by way of setters...

</Trigger>

例如,我们希望看到,当您悬停鼠标光标时,会更改Foreground颜色和FontSize。然后我们选择属性IsMouseOver,然后写一个Trigger

<Style x:Key="LabelWinner" TargetType="{x:Type Label}">
    <Setter Property="Effect">
        <Setter.Value>
            <DropShadowEffect Color="#FF000000" ShadowDepth="6" />
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Foreground" Value="Green" />
            <Setter Property="FontSize" Value="14" />
        </Trigger>
    </Style.Triggers>
</Style>

应该记住,在WPF中有一个值优先级列表(MSDN),即本地值的优先级高于触发器样式。因此,如果您在Label的属性的值将在本地设置,则触发器将无法更改它,例如:

<Label Foreground="Red" ... /> <!-- Trigger don't change foreground -->

如果缺少标准属性,或者需要实现您的方案,那么它具有附加的依赖属性(MSDN)。在其中,您可以设置任何条件,例如以它将起作用的样式启动动画和触发器。

附加依赖项属性的触发器示例:

<Trigger Property="local:YourClass.MyProperty" Value="True">
    <Setter TargetName="SaveButton" Property="Background" Value="AliceBlue" />
</Trigger>