18

这是我的场景。

我有 2 个属性。类型和状态。

类型是具有 3 个值的枚举,例如球、汽车、箭头。State 是一个 int,它可以接受 3 个状态值,例如 -1、0、1。此外,每个状态值我都有 9 个图像。

就像,如果我选择类型为球,值为 -1,我想显示一个红色的球。如果我选择类型作为箭头并将值选择为 1,我想显示一个向上箭头。ETC。,

我可以在 WPF 中做到这一点。我创建了 3 个带有空图像的 DataTemplates。然后,我使用 DataTrigger 检查和更新所选 StateValue 的特定图像。

但是,在 Silverlight 中,我该怎么做。我知道,我必须在 VSM 中进行。但是,我想知道有关此(或)任何可用替代方案的更多详细信息。

4

4 回答 4

17

我会在 Silverlight 中将 GoToState 行为与 DataTriggers 一起使用。Blend中非常简单:

把你所有的逻辑放在你的视图模型中,让你进入不同的状态。将状态公开为枚举。打开状态选项卡。创建一个新的状态组(如果您还没有)。创建你的状态。从资产选项卡中,选择行为。将 GoToState 行为从 Assets 选项卡拖放到您的根视觉元素上。在“属性”面板中,单击 TriggerType 旁边的“新建”按钮并选择 DataTrigger。还记得视图模型上的那个枚举吗?将触发器绑定设置为视图模型上的状态枚举。将触发值设置为枚举的值。将 StateName 设置为目标状态。

Blend 现在应该已经为您生成了所有的 VSM XAML。一旦掌握了窍门,您就会发现在某些情况下,您甚至不需要视图模型上的枚举——您将能够完全摆脱视图的状态。

于 2010-11-11T18:25:53.717 回答
13

为了扩展 Mike Post 的帖子,这里是 XAML,以防您没有 Blend。

您需要添加对 Microsoft.Expression.Interactions 和 System.Windows.Interactivity 的引用。

xmlns:ia="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions" 
xmlns:iv="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 

然后在您的控件中,在与 VisualStateManager 相同的级别放置:

<iv:Interaction.Triggers>
    <ia:DataTrigger Binding="{Binding PropertyName}" Value="PropertyValue"  >
        <ia:GoToStateAction StateName="StateName" />
    </ia:DataTrigger>
</iv:Interaction.Triggers>
于 2011-04-20T08:21:20.657 回答
6

我只是使用一个转换器,它可以获取具有 2 个属性的对象并返回一个图像。纯 XAML 中的类似代码很痛苦,并且确实属于 C#。

于 2010-09-17T16:32:11.083 回答
5

博客文章“Silverlight 中的表达式 SDK–DataTrigger 示例”很好地涵盖了它。以下是他所做的一个示例:

<i:Interaction.Triggers>
    <ia:DataTrigger Binding="{Binding IsEnabled}" Comparison="Equal" Value="false">
        <ia:ControlStoryboardAction Storyboard="{StaticResource DisableStoryboard}"></ia:ControlStoryboardAction>
    </ia:DataTrigger>

    <ia:DataTrigger Binding="{Binding IsEnabled}" Comparison="Equal" Value="true">
        <ia:ControlStoryboardAction Storyboard="{StaticResource EnableStoryboard}"></ia:ControlStoryboardAction>
    </ia:DataTrigger>
</i:Interaction.Triggers>

(使用两个 XML 命名空间前缀iia定义如下:)

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ia="http://schemas.microsoft.com/expression/2010/interactions"
于 2011-12-08T05:12:12.400 回答