这是我的情景。
我有2个属性。类型和状态。
类型是具有3个值的枚举,例如球,车,箭头。 State是一个int,可以接受3个状态值,例如,-1,0,1。另外,每个状态值都有9个图像。
就像,如果我选择类型为球,值为-1,我想显示一个红色球。 如果我选择类型为箭头并将值选为1,我想显示向上箭头。等,
我可以在WPF中执行此操作。我创建了3个带有空图像的DataTemplates。然后,我使用DataTrigger检查并更新所选StateValue的特定图像。
但是,在silverlight中我该怎么做呢。我知道,我必须在VSM中这样做。但是,我想知道有关此(或)任何替代方案的更多细节。
答案 0 :(得分:17)
我在Silverlight中使用GoToState行为和DataTriggers。 Blend非常简单:
将您的所有逻辑用于驱动视图模型中不同状态的所有逻辑。 将状态公开为枚举。 打开“状态”选项卡。 创建一个新的状态组(如果您还没有)。 创建你的州。 从“资产”选项卡中,选择“行为”。 从“资源”选项卡中拖动GoToState行为,并将其放在根视觉元素上。 在“属性”面板中,单击“TriggerType”旁边的“新建”按钮,然后选择“DataTrigger”。 还记得您的视图模型上的枚举吗?将Trigger Binding设置为视图模型上的状态枚举。 将Trigger Value设置为枚举值。 将StateName设置为目标状态。
Blend现在应该为您生成所有VSM XAML。一旦掌握了一些东西,你会发现在某些情况下你甚至不需要视图模型上的枚举 - 你将能够完全从视图中驱动状态。
答案 1 :(得分: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>
答案 2 :(得分:6)
我只是使用一个转换器,它将你的对象带有2个属性并返回一个图像。像纯XAML中的代码是痛苦的,并且真正属于C#。
答案 3 :(得分:5)
博文"Expression SDK in Silverlight–DataTrigger Example"非常清楚。以下是他所做的一个示例:
<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名称空间前缀i
和ia
定义如下:)
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ia="http://schemas.microsoft.com/expression/2010/interactions"