DataTrigger в WinRT?
Мне удалось найти EventTrigger в ссылке WinRT, однако я не смог найти DataTrigger. Я также не смог использовать его в приложении.
Может ли кто-нибудь подтвердить, что DataTrigger действительно отсутствует в WinRT? Является ли EventTrigger единственным триггером, доступным в WinRT?
Ответы
Ответ 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>