DataTrigger в коде - PullRequest
       4

DataTrigger в коде

0 голосов
/ 05 июня 2011

Я пытался заставить это работать, основываясь на ответе, который я получил на [Конвертировать некоторые XAML в C # с помощью WPF] [1] , но я что-то упустил.

Я вставил образец моего кода ниже.

// uGrid = UniformGrid
uGrid.Columns=2;
// test - setup first ellipse
Ellipse ellipse1 = new Ellipse() { Width=25, Height=25, Fill=Brushes.DodgerBlue, Margin= new Thickness(3), Opacity=0 };
uGrid.Children.Add(ellipse1);
var fadeEllipse1 = new DoubleAnimation() { From = 0, To = 1, Duration = TimeSpan.FromSeconds(this.secondsToFade), FillBehavior=FillBehavior.Stop };
Storyboard.SetTarget(fadeEllipse1, ellipse1);
Storyboard.SetTargetProperty(fadeEllipse1, new PropertyPath(Ellipse.OpacityProperty));
Storyboard storyBoard = new Storyboard();

storyBoard.Children.Add(fadeEllipse1);
storyBoard.RepeatBehavior=RepeatBehavior.Forever;

// test - setup 2nd ellipse using example below
Ellipse ellipse2 = new Ellipse() { Width=25, Height=25, Fill=Brushes.DodgerBlue, Margin= new Thickness(3), Opacity=0 };
uGrid.Children.Add(ellipse2);

var style = new Style(typeof(Ellipse));
var trigger = new DataTrigger();
trigger.Binding = new Binding("Opacity") { ElementName = "ellipse1" };
trigger.Value = 1;

Storyboard sb = new Storyboard();

var fadeEllipse2 = new DoubleAnimation() { From = 0, To = 1, Duration = TimeSpan.FromSeconds(this.secondsToFade), FillBehavior=FillBehavior.Stop };
Storyboard.SetTarget(fadeEllipse2, ellipse2);
Storyboard.SetTargetProperty(fadeEllipse2, new PropertyPath(Ellipse.OpacityProperty));
Storyboard.SetTargetName(fadeEllipse2, ellipse2.Name);
sb.Children.Add(fadeEllipse2);
sb.RepeatBehavior=RepeatBehavior.Forever;

trigger.EnterActions.Add(new BeginStoryboard() { Storyboard = sb });
style.Triggers.Add(trigger);

storyBoard.Begin();

1 Ответ

3 голосов
/ 06 июня 2011

В вашем коде есть несколько ошибок:

  1. Вы создаете стиль, но нигде не используете его, пропускаете строку

    ellipse2.Style = style;
    
  2. Вы пытаетесь привязать элемент с именем ellipse1, но он не существует (наличие переменной с этим именем - не одно и то же).Но даже если вы установите Name из ellipse1, это не сработает.Вы должны объявить имя в XAML для этого.В коде позади вы можете использовать Source и связываться с другим эллипсом напрямую, без использования имен (что в любом случае будет лучшим решением, даже если использование имен работает):

    trigger.Binding = new Binding("Opacity") { Source = ellipse1 };
    
  3. Вы сравниваете, имеют ли два числа с одинаковым значением 1020 *.Это почти всегда плохая идея, и особенно в этом случае.Opacity из ellispse1 не меняется непрерывно, оно меняется при прыжке.По умолчанию значение изменяется не более 60 раз в секунду (по крайней мере, так было, когда я проверял его, я нигде не обнаружил, что это значение задокументировано).Таким образом, Opacity может начинаться ровно с 0, оставаться таким в течение 1/60 с, а затем перейти к 1/60.Из-за этого сравнение для точного значения даже менее надежно, чем при сравнении двойных чисел для равенства обычно (что не является надежным для начала).Использование конвертера, который проверяет, больше ли непрозрачность, чем 0.99, похоже, работает для меня, но это все еще не надежно: если диспетчер занят, непрозрачность может, например, подскочить с 0,85 до 0,12.

    public class GreaterThanConverter : IValueConverter
    {
        public object Convert(
            dynamic value, Type targetType, dynamic parameter, CultureInfo culture)
        {
            return value > parameter;
        }
    
        public object ConvertBack(
            object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException();
        }
    }
    
    trigger.Binding = new Binding("Opacity")
                        {
                            Source = ellipse1,
                            Converter = new GreaterThanConverter(),
                            ConverterParameter = 0.99
                        };
    trigger.Value = true;
    
  4. Очевидно

    В дереве раскадровки в стиле не может быть указано TargetName.Удалите TargetName.

    Поэтому удалите следующее, как будто, это все равно бесполезно.

    Storyboard.SetTargetName(fadeEllipse2, ellipse2.Name);
    
...