DataTrigger в WinRT? - PullRequest
       33

DataTrigger в WinRT?

18 голосов
/ 16 сентября 2011

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

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

Ответы [ 5 ]

20 голосов
/ 16 сентября 2011

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

Дополнение от Mike Brown

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

3 голосов
/ 11 октября 2013

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

2 голосов
/ 12 июня 2014

Я не знаю, когда это изменилось, но у меня есть 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>
0 голосов
/ 22 сентября 2012

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

  1. Создайте UserControl (с нуля или с наследованием), чтобы вы могли записать некоторый код C-code в элемент управления.
  2. Создайте свойство DependencyProperty в коде для привязки данныххотите активировать.
  3. Используйте метод PropertyChangedCallback объекта DependencyProperty, чтобы реализовать выполнение того, что вам нужно сделать в коде с элементом управления.
  4. Привязать свойство 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); }
}
0 голосов
/ 12 июля 2012

вы можете использовать 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>
...