代码之家  ›  专栏  ›  技术社区  ›  Jason

DataTrigger未在Silverlight中使用GoToStateAction

  •  2
  • Jason  · 技术社区  · 15 年前

    下面的XAML表示我试图在Expression Blend中构建的一个对象。StackPanel中的DataTrigger有问题-应用程序没有转到 空的 当触发器与数据匹配时。此代码后面有进一步的解释:

      <DataTemplate x:Key="SampleTemplate">
       <StackPanel x:Name="SampleStack" Style="{StaticResource DefaultSampleStyle}" Width="64" Height="60">
        <VisualStateManager.VisualStateGroups>
         <VisualStateGroup x:Name="VisualStateGroup">
          <VisualStateGroup.Transitions>
           <VisualTransition GeneratedDuration="0">
            <Storyboard>
             <ColorAnimation Duration="0" To="#FFDFE04B" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/>
            </Storyboard>
           </VisualTransition>
          </VisualStateGroup.Transitions>
          <VisualState x:Name="Empty">
           <Storyboard>
            <ColorAnimation Duration="0" To="#FF4B6FE0" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/>
           </Storyboard>
          </VisualState>
         </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <VisualStateManager.CustomVisualStateManager>
         <ei:ExtendedVisualStateManager/>
        </VisualStateManager.CustomVisualStateManager>
        <i:Interaction.Triggers>
         <ei:DataTrigger Binding="{Binding IsActive}" Value="False">
          <ei:GoToStateAction StateName="Empty" UseTransitions="False"/>
         </ei:DataTrigger>
        </i:Interaction.Triggers>
        <TextBlock x:Name="StartOn" Text="{Binding StartOn, StringFormat=hh:mm}"/><TextBlock x:Name="textBlock" Text="-" />    
        <TextBlock x:Name="EndOn" Text="{Binding EndOn, StringFormat=hh:mm}"/>
       </StackPanel>
      </DataTemplate>
    

    如果我使用 事件触发器 用一个 加载 价值 空的 状态的正确应用基于 不活跃 结合。 如果我使用现有的 数据触发器 并根据 不活跃 这同样有效。

    我在XAML中做了一些根本性的错误吗?您需要一个更完整的XAML示例来理解这个问题吗?

    1 回复  |  直到 15 年前
        1
  •  7
  •   TerenceJackson    15 年前

    你需要手术吗?

    我想,问题在于“启动时”的绑定。我添加了一个调度程序,并在一秒钟后再次抛出NotifyPropertyChanged。那就行了。很显然你可以这样解决。您等待控件加载完毕,然后再次抛出属性更改。这不是一个好的方法,与您的想法类似(如果我使用带有加载值的EventTrigger,…)

    我建议您使用datastatebehavious。如果你有一个布尔值来决定你要去哪个州,这很好。这是一种行为,您可以将条件绑定到属性,然后设置true和false状态。

    它看起来是这样的(我做了一些调整只是为了测试我的电脑):

    <DataTemplate x:Key="SampleTemplate">
                <StackPanel x:Name="SampleStack" Width="64" Height="60" Background="White">
                    <i:Interaction.Behaviors>
                        <ei:DataStateBehavior Binding="{Binding IsChecked}" Value="True" TrueState="Empty" FalseState="Base"/>
                    </i:Interaction.Behaviors>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="VisualStateGroup">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="0"/>
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Empty">
                                <Storyboard>
                                    <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="SampleStack" d:IsOptimized="True"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Base"/>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <VisualStateManager.CustomVisualStateManager>
                        <ei:ExtendedVisualStateManager/>
                    </VisualStateManager.CustomVisualStateManager>
                    <TextBlock x:Name="StartOn" Text="Test"/>
                </StackPanel>
            </DataTemplate>
    

    如您所见,我向VisualStateGroup添加了第二个状态(现在是空的和基的)。我建议这样做,不仅是因为datastatebehavious在一个组中至少需要两个状态。如果只有一个状态,则没有机会将此组的状态更改回正常状态,例如。

    我希望这个答案对你有帮助。

    比尔,

    TJ公司

    推荐文章