如何在Silverlight 4.0中使用Style.Triggers?

6

我已经从 WPF 切换到 Silverlight 4.0,但却遇到了一些基本的问题。似乎我无法在我的样式中使用触发器(Trigger)。那么这该如何解决呢?

例如,下面是我在 ResourceDictionary 中创建的 DataGrid ColumnHeader 样式:

<Style x:Key="DataGridColumnHeaderStyle" TargetType="sdk:DataGridColumnHeader"  >
        <Setter Property="Background" Value="#88800080" />
        <Setter Property="Foreground" Value="White" />
        <Style.Triggers>
            <Trigger Property="SortDirection" Value="{x:Null}">
                <Setter Property="Background" Value="{DynamicResource DataGridHeaderBackgroundBrush}" />
                <Setter Property="BorderBrush"  Value="Transparent" />
            </Trigger>
            <MultiTrigger>
                <MultiTrigger.Conditions>
                    <Condition Property="IsMouseOver" Value="True" />
                    <Condition Property="SortDirection" Value="{x:Null}" />
                </MultiTrigger.Conditions>
                <Setter Property="Background" Value="{StaticResource DataGridHeaderMouseOverBackgroundBrush}" />
                <Setter Property="BorderBrush" Value="{StaticResource DataGridHeaderBorderBrush}" />
            </MultiTrigger>
...

早在2009年初,一些谷歌搜索尝试声称使用转换器,但我完全被卡住了。如果有人能给我一些关于如何做到这一点的提示,我将不胜感激。

1个回答

8
Expression Blend为Silverlight添加了一些支持WPF类型触发器的功能。这篇博客文章对此进行了更详细的解释。
但是简而言之,与WPF不同,你无法使用这些触发器获得相同的值优先级。也就是说,样式触发器可以覆盖在元素上明确设置的属性。
Silverlight使用VisualStateManager概念来“主题化”或自定义控件的外观。它有效地强制你定义“固定”的状态,比如悬停(即IsMouseOver=true)或按下。然后,当进入或退出这些状态时,你可以应用动画。因此,你可以说,在悬停时动画背景刷以给出悬停外观。
VisualStateManager方法使得提供围绕自定义控件外观的工具变得更加容易。这在这篇博客文章中有更详细的介绍。
因此,简而言之,你无法一对一地进行翻译。你会发现有许多类似的情况。例如,在UIElement上没有像WPF中的IsMouseOver属性。

@Kave - 基本上,是的 :-) 第一个链接展示了一些简单事物的解决方法,但总体而言,VSM并不像触发器那样有趣。 - CodeNaked
哇,那真是疯狂。触发器是WPF的重要组成部分。无法想象没有它们的情况 :) 但我别无选择,只能适应。 - Houman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接