Как использовать DataTrigger из кода в Silverlight? - PullRequest
0 голосов
/ 28 сентября 2011

Я нашел несколько примеров, относящихся к WPF, но ни одного для Silverlight.

Итак, что является рабочим примером настройки Microsoft.Expression.Interactivity.Core.DataTrigger в коде?

Вот код, который у меня сейчас есть, хотя он не работает (без исключений, но во время выполнения ничего не происходит):

// Set up a storyboard
var duration = new Duration(TimeSpan.FromMilliseconds(400));
var animation = new ColorAnimation
{
    To = Colors.White,
    RepeatBehavior = RepeatBehavior.Forever,
    AutoReverse = true,
    Duration = duration
};
var sb = new Storyboard
{
    RepeatBehavior = RepeatBehavior.Forever, 
    AutoReverse = true, 
    Duration = duration
};
sb.Children.Add(animation);
Storyboard.SetTarget(animation, fillBrush);
Storyboard.SetTargetProperty(animation, new PropertyPath("(SolidColorBrush.Color)"));

// Configure the data trigger
var focusTrigger = new DataTrigger
{
    Binding = new Binding("IsFocussed")
    {
        Source = asset,
        Mode = BindingMode.OneWay
    }, 
    Value = true
};
focusTrigger.Actions.Add(new ControlStoryboardAction
{
    Storyboard = sb, 
    ControlStoryboardOption = ControlStoryboardOption.Play, 
    IsEnabled = true
});

asset.IsFocussed изменяет и вызывает уведомления об изменениях через INotifyPropertyChanged.

Ответы [ 2 ]

0 голосов
/ 23 октября 2011

В итоге мне не хватило двух битов:

  1. Добавить триггер к кисти:

    var triggers = Interaction.GetTriggers(fillBrush);
    triggers.Add(focusTrigger);
    
  2. Установить привязку натриггер, использующий BindingOperators.SetBinding, а не установщик свойства Binding:

    var binding = new Binding("IsFocussed") { Source = asset, Mode = BindingMode.OneWay };
    BindingOperations.SetBinding(focusTrigger, PropertyChangedTrigger.BindingProperty, binding);
    

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

Надеюсь, это поможет кому-то еще.

0 голосов
/ 30 сентября 2011

Попробуйте использовать пространство имен:

System.Windows.Interactivity

и добавьте следующее после комментария «Настройка триггера данных»

// Configure the data trigger

// Configure the TriggerCollection
TriggerCollection triggers = Interaction.GetTriggers(fillBrush);
var focussedTrigger = new EventTrigger("GotFocus");
focussedTrigger.Actions.Add(
            new ControlStoryboardAction{Storyboard = sbFocussed});

var unfocussedTrigger = new EventTrigger("LostFocus");
unfocussedTrigger.Actions.Add(
            new ControlStoryboardAction { Storyboard = sbUnfocussed });

triggers.Add(focussedTrigger);
triggers.Add(unfocussedTrigger);

Примечание:

using EventTrigger = System.Windows.Interactivity.EventTrigger;
using TriggerCollection = System.Windows.Interactivity.TriggerCollection;
...