Подтвердить что ты не робот

DataTrigger в WinRT?

Мне удалось найти EventTrigger в ссылке WinRT, однако я не смог найти DataTrigger. Я также не смог использовать его в приложении.

Может ли кто-нибудь подтвердить, что DataTrigger действительно отсутствует в WinRT? Является ли EventTrigger единственным триггером, доступным в WinRT?

4b9b3361

Ответ 1

Я не знаю, когда он изменился, но у меня есть DataTriggerBehavior и GoToStateAction их объединение должно решить вашу проблему...

Импорт пространства имен

xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core"

Местоположение ViewSateManager на корневом элементе

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="Common">
        <VisualStateGroup.Transitions>
            <VisualTransition GeneratedDuration="0" To="Online">
                <Storyboard>
                    <ColorAnimation Duration="0" To="Lime" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="Name" />
                </Storyboard>
            </VisualTransition>
            <VisualTransition GeneratedDuration="0" To="Offline">
                <Storyboard>
                    <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="Name" />
                </Storyboard>
            </VisualTransition>
        </VisualStateGroup.Transitions>
        <VisualState x:Name="Online" />
        <VisualState x:Name="Offline" />
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Interactivity:Interaction.Behaviors>
    <Core:DataTriggerBehavior Binding="{Binding Active}" Value="True">
        <Core:GoToStateAction StateName="Online" />
    </Core:DataTriggerBehavior>
    <Core:DataTriggerBehavior Binding="{Binding Active}" Value="False">
        <Core:GoToStateAction StateName="Offline" />
    </Core:DataTriggerBehavior>
</Interactivity:Interaction.Behaviors>

Ответ 2

DataTrigger в настоящее время не поддерживается в WinRT XAML.

Добавление Майка Брауна

API DataTrigger был заменен на VisualStateManager аналогичный API для триггеров данных, предоставленный Blend SDK для Silverlight. Поскольку шаблон Attached Behavior работает в WinRT, можно сделать то же самое.

Ответ 3

Как насчет этого проекта, который, похоже, запускает триггеры в WinRT: http://winrttriggers.codeplex.com/

Ответ 4

Я применил альтернативное обходное решение, которое может сработать для вас. Шаги:

  • Создайте UserControl (либо с нуля, либо наследуйте), чтобы вы могли написать код С# в коде.
  • Создайте DependencyProperty в коде для привязки данных, которую вы хотите активировать.
  • Используйте метод DependencyProperty PropertyChangedCallback для реализации того, что вам нужно сделать в коде для элемента управления.
  • Привязать DependencyProperty в XAML к данным, которые вы хотите активировать.

Это не так чисто, как DataTrigger, но это не намного хуже, и он работает хорошо (для меня как минимум).

Объявление в XAML (DataContext уже установлен в объект viewmodel):

<local:PlayButton IsPlaying="{Binding IsPlaying}"/>

Пример DependencyProperty, который запускает раскадровки для изменения состояния:

// Use this to implement storyboard changing in W8 since triggers are not supported
public static readonly DependencyProperty IsPlayingProperty = DependencyProperty.Register(
      "IsPlaying",
      typeof(bool),
      typeof(PlayButton),
      new PropertyMetadata(null,
          new PropertyChangedCallback(OnIsPlayingChanged)
      ));

private static void OnIsPlayingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    PlayButton pb = (PlayButton)d;
    bool isPlaying = (bool)e.NewValue;

    if (isPlaying == false)
        pb.GotoPlay.Begin();
    else
        pb.GotoPause.Begin();
}

public bool IsPlaying
{
    get { return (bool)GetValue(IsPlayingProperty); }
    set { SetValue(IsPlayingProperty, value); }
}

Ответ 5

вы можете использовать VisualState вместо object.Triggers в Windows 8 Вот код

<ControlTemplate TargetType="Button">
  <Grid>
    <VisualStateManager.VisualStateGroups>
      <VisualStateGroup x:Name="CommonStates">
        <VisualStateGroup.Transitions>
          <!--Take one half second to transition to the PointerOver state.-->
          <VisualTransition To="PointerOver" GeneratedDuration="0:0:0.5"/>
        </VisualStateGroup.Transitions>

        <VisualState x:Name="Normal" />

        <VisualState x:Name="PointerOver">
          <Storyboard>
            <ColorAnimation Storyboard.TargetName="ButtonBrush"
                            Storyboard.TargetProperty="Color" To="Red" />
          </Storyboard>
        </VisualState>
      </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Grid.Background>
      <SolidColorBrush x:Name="ButtonBrush" Color="Green"/>
    </Grid.Background>
  </Grid>
</ControlTemplate>