DataTrigger в WinRT?

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

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


person Murven    schedule 16.09.2011    source источник
comment
msdn.microsoft.com/en -us/library/windows/apps/ ... и это так плохо, что вы хотите запускать событие, а не элемент данных? Также стоит повторить, что это даже не бета-стадии...   -  person jcolebrand    schedule 16.09.2011
comment
Это не плохо и не хорошо, я просто хотел подтверждения, чтобы больше не тратить время на этот путь. Кстати, мой вопрос ссылается на ту же ссылку, на которую вы мне указываете. Чтобы изменить состояние представления, я использую поведение DataTrigger или Blend, например GoToStateAction, и ни одно из них в настоящее время недоступно, я просто хотел убедиться, что мне действительно нужно искать обходной путь.   -  person Murven    schedule 17.09.2011
comment
DataTriggers были исключены в Silverlight для ViewStateManager Похоже, они взяли тот же подход в WinRT   -  person Michael Brown    schedule 09.10.2012
comment
Это интересное решение, я не думаю, что VisualStateManager каким-либо образом заменяет триггеры данных, просто по совпадению разработчики использовали эти триггеры для выполнения действий, связанных с VisualStateManager, однако в WPF 4 я в полной мере использую оба VisualStateManager < i>и триггеры данных.   -  person Murven    schedule 20.10.2012


Ответы (5)


Я не знаю, когда это изменилось, но у меня есть 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>
person Peter    schedule 11.06.2014
comment
не могли бы вы добавить ссылку на пространство имен Microsoft.Xaml.Interactions.Core, в какой сборке оно содержится и частью какого продукта оно является? Спасибо! - person Murven; 18.06.2014
comment
Я нашел ссылку: пространство имен Microsoft.Xaml.Interactions.Core находится в сборке Microsoft.Xaml.Interactions.dll, которая включена в Behaviors SDK (XAML) для Visual Studio 2013, которая является частью Blend для Visual Studio 2013. - person Murven; 18.06.2014

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

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

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

person Tim Heuer    schedule 16.09.2011
comment
люблю авторитетные ответы - person jcolebrand; 17.09.2011
comment
Я бы сказал, что это большое упущение. Планируется ли это в финальной версии? - person svick; 17.09.2011
comment
Помните, что WinRT был разработан с использованием Silverlight в качестве отправной точки. (На BUILD выяснилось, что команда разработчиков WinRT API изучила MSIL приложений Windows Phone 7, представленных на рынке, чтобы увидеть, какие классы/методы обычно используются в реальных приложениях.) Так же, как System.Data отсутствует. от Silverlight и WinRT, так же как и триггеры. Возможно, некоторые из этих функций WPF появятся в Windows 9, но для Windows 8 это маловероятно. - person Tao Yue; 23.02.2012
comment
Я до сих пор не понимаю, как VisualStateManager представляет собой замену триггеров данных. Они предлагают разные функции и могут использоваться вместе. Есть ли у вас какие-либо дополнительные сведения о том, почему было решено, что VisualStateManager может работать вместо DataTrigger? - person Murven; 15.04.2013

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

person Vincent Rich    schedule 11.10.2013
comment
Этот проект, похоже, также не поддерживает DataTrigger. - person Murven; 13.10.2013
comment
@Murven: рассмотрите возможность использования PropertyChangedTrigger. - person Illidan; 21.03.2014

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

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

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

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

<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); }
}
person Ray Ackley    schedule 22.09.2012
comment
Да, я согласен, что это хороший обходной путь для отсутствия DataTriggers. Просто грустно, что то, что хорошо работало и предлагало удобство и полную поддержку Blend, было удалено из технологии, которая считается будущим Windows-приложений. WPF по-прежнему намного лучше и превосходит Silverlight и WinRT во многих отношениях. - person Murven; 13.10.2013

вы можете использовать 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>
person Ibraheem Osama    schedule 12.07.2012
comment
Не могли бы вы объяснить, почему вы думаете, что это работает как замена DataTriggers? Я не вижу в вашем примере ничего, что позволило бы мне создать привязку к данным в модели представления, и изменения в этой привязке привели бы к изменениям в пользовательском интерфейсе. - person Murven; 15.04.2013